[英]Parsing URL/web-service
我向第三方API發出了請求,它以XML給出了以下響應。
<?xml version="1.0" ?>
<abc>
<xyz>
<code>-112</code>
<message>No such device</message>
</xyz>
</abc>
我使用此代碼閱讀。
XmlDocument doc = new XmlDocument();
doc.Load("*** url ***");
XmlNode node = doc.SelectSingleNode("/abc/xyz");
string code = node.SelectSingleNode("code").InnerText;
string msg = node.SelectSingleNode("message").InnerText;
Response.Write("Code: " + code);
Response.Write("Message: "+ msg);
但是我在這條線上出現錯誤:
string code = node.SelectSingleNode("code").InnerText;
錯誤是:
你調用的對象是空的。
我將XML文件的第一行更改為:
<?xml version="1.0"?>
使其成為有效的XML。 進行此更改后,您的代碼對我有用。 沒有更改,解析器將引發異常。
如您所給, 您的代碼似乎沒有任何問題 編輯:您的聲明是錯誤的,正如svinja指出的那樣,您的xml甚至不會加載到XmlDocument中。
但是,我猜測您的xml更復雜,並且至少涉及一個名稱空間,這將導致選擇失敗。
它不是很漂亮,但是您可以使用與名稱空間無關的xpath來定位您的節點,以避免使用XmlNamespaceManager
:
XmlDocument doc = new XmlDocument();
doc.Load("*** url ***");
XmlNode node = doc.SelectSingleNode("/*[local-name()='abc']/*[local-name()='xyz']");
string code = node.SelectSingleNode("*[local-name()='code']").InnerText;
string msg = node.SelectSingleNode("*[local-name()='message']").InnerText;
Response.Write("Code: " + code);
Response.Write("Message: "+ msg);
編輯-詳細說明
如果將聲明更正為<?xml version="1.0"?>
則您的代碼可以正常工作
但是,如果將名稱空間引入混合,除非您正確使用名稱空間管理器,否則代碼將失敗。
我上面不可知的xpath也將像這樣解析xml文檔:
<?xml version="1.0"?>
<abc xmlns="foo">
<xyz xmlns="bar">
<code xmlns="bas">-112</code>
<message xmlns="xyz">No such device</message>
</xyz>
</abc>
您可以使用LINQ to XML(如果可以的話):
XDocument doc = XDocument.Load(url);
var selectors = (from elements in doc.Elements("abc").Elements("xyz")
select elements).FirstOrDefault();
string code = selectors.Element("code").Value;
string msg = selectors.Element("message").Value;
[XmlRoot("abc")]
public class Entity
{
[XmlElement("xyz")]
public SubEntity SubEntity { get; set; }
}
public class SubEntity
{
[XmlElement("code")]
public string Code { get; set; }
[XmlElement("message")]
public string Message { get; set; }
}
並使用標准的xmlserializer
var xmlSerializer = new XmlSerializer(typeof(Entity));
var result = xmlSerializer.Deserialize(new XmlTextReader("*** url ***"));
Response.Write("Code: " + result.SubEntity.Code);
Response.Write("Message: "+ result.SubEntity.Message);
<?xml version="1.0">
<abc>
<xyz>
<code>-112</code>
<message> No such device </message>
</xyz>
</abc>
嘗試設置一個列表:
XmlNodeList nodeList = root.SelectNodes("/abc/xyz");
然后讀取所有節點並獲取其文本:
foreach(XmlNode node in nodeList)
{
if(node.Name == "code")
{
string code = node.InnerText;
}
else
if(node.Name == "message")
{
string msg = node.InnerText;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.