1

我向第三方 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;

错误是:

你调用的对象是空的。

4

5 回答 5

6

我将您的 XML 文件的第一行更改为:

<?xml version="1.0"?>

使其成为有效的 XML。通过此更改,您的代码对我有用。如果没有更改,解析器将引发异常。

于 2012-08-16T11:14:25.810 回答
1

正如你所给予的,您的代码似乎没有任何问题 编辑:您的声明是错误的,正如 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>
于 2012-08-16T11:14:44.310 回答
1

您可以使用 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;
于 2012-08-16T11:35:35.953 回答
0
[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);
于 2012-08-16T11:16:56.823 回答
0
<?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;
  }
}
于 2012-08-16T11:35:03.013 回答