#asp.net #xml #vb.net #http-post
#asp.net #xml #vb.net #http-post
Вопрос:
Я отправляю на веб-сайт, чтобы получить данные обратно. Сайт возвращает его как xml. Я могу преобразовать данные в строку. Но что я действительно хочу сделать, так это иметь каждый элемент в xml в отдельном строковом поле.
Sub lookup(ByVal Source As Object, ByVal e As EventArgs)
Dim wData As String
wData = WRequest("http://PostToThisSite.com", "POST","str=31amp;Password=pnamp;UserID=Qamp;Postcode=" txtPcode.Text)
Response.Write(wData)
End Sub
Function WRequest(URL As String, method As String, POSTdata As String) As String
Dim responseData As String = ""
Try
Dim hwrequest As Net.HttpWebRequest = Net.Webrequest.Create(URL)
hwrequest.Accept = "*/*"
hwrequest.AllowAutoRedirect = true
hwrequest.UserAgent = "http_requester/0.1"
hwrequest.Timeout = 60000
hwrequest.Method = method
If hwrequest.Method = "POST" Then
hwrequest.ContentType = "application/x-www-form-urlencoded"
Dim encoding As New Text.ASCIIEncoding() 'Use UTF8Encoding for XML requests
Dim postByteArray() As Byte = encoding.GetBytes(POSTdata)
hwrequest.ContentLength = postByteArray.Length
Dim postStream As IO.Stream = hwrequest.GetRequestStream()
postStream.Write(postByteArray, 0, postByteArray.Length)
postStream.Close()
End If
Dim hwresponse As Net.HttpWebResponse = hwrequest.GetResponse()
If hwresponse.StatusCode = Net.HttpStatusCode.OK Then
Dim responseStream As IO.StreamReader = _
New IO.StreamReader(hwresponse.GetResponseStream())
responseData = responseStream.ReadToEnd()
End If
hwresponse.Close()
Catch e As Exception
responseData = "An error occurred: " amp; e.Message
End Try
Return responseData
End Function
Приведенный выше код работает и записывает строку…
Какой-то дорожный город LU1 5QG
Возвращаемый Xml является ..
<Address xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://site.co.uk/">
<strOrganisation />
<strProperty />
<strStreet>Some Road</strStreet>
<strLocality />
<strTown>City</strTown>
<strCounty />
<strPostcode>LU1 5QG</strPostcode>
<strDPS />
Я хочу иметь возможность разделить эти поля и установить для них разные текстовые поля на странице … справка?
Ответ №1:
Загрузите строку xml в XmlDocument и извлеките значения с помощью XPath:
Dim doc = new XmlDocument()
doc.LoadXml(yourXmlString)
Dim nsm = new XmlNamespaceManager(doc.NameTable)
nsm.AddNamespace("a", "http://site.co.uk/")
txtStreet.Text = doc.SelectSingleNode("/a:Address/a:strStreet", nsm).InnerText
Вот рабочий фрагмент:
Dim doc = New XmlDocument()
doc.LoadXml("<Address xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns=""http://site.co.uk/""><strOrganisation /> <strProperty /> <strStreet>Some Road</strStreet> <strLocality /> <strTown>City</strTown> <strCounty /> <strPostcode>LU1 5QG</strPostcode><strDPS /></Address>")
Dim nsm = New XmlNamespaceManager(doc.NameTable)
nsm.AddNamespace("a", "http://site.co.uk/")
Dim streetValue = doc.SelectSingleNode("/a:Address/a:strStreet", nsm).InnerText
Некоторые вещи, на которые следует обратить внимание:
- Для поиска в XPath, если ваш xml имеет пространство имен, вам нужно будет добавить его в XmlNamespaceManager, созданный из NameTable вашего XML-документа.
- Если вы не хотите беспокоиться об этом, вы можете вручную просмотреть коллекции узлов через
doc.ChildNodes[0].ChildNodes[0]
etc.
Комментарии:
1. Исключение System.NullReferenceException: ссылка на объект не установлена для экземпляра объекта.
2. Элемент адреса завершается, ошибка возникает в txtStreet. Текст = документ. SelectSingleNode(«/Address/strStreet»). Значение
Ответ №2:
Или попробуйте это, о чем, я полагаю, спрашивал автор.
» Используйте средство чтения XML
Dim xmlDoc = New XmlDocument
Dim xmlNode As Xml.XmlNode
xmlDoc.LoadXml(strResponse)
xmlNode = xmlDoc.SelectSingleNode("//" "strStreet")
If Not xmlNode Is Nothing Then
Dim Street = xmlNode.InnerText
End If