簡體   English   中英

解析URL / Web服務

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM