Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 解析URL/web服务_C#_Asp.net_Xml_Xml Parsing - Fatal编程技术网

C# 解析URL/web服务

C# 解析URL/web服务,c#,asp.net,xml,xml-parsing,C#,Asp.net,Xml,Xml Parsing,我向第三方API发出了一个请求,它以XML给出了以下响应 <?xml version="1.0" ?> <abc> <xyz> <code>-112</code> <message>No such device</message> </xyz> </abc> 我用这个代码读这个 XmlDocument doc = new XmlDocument(); doc.Load("***

我向第三方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。有了这个改变,你的代码对我有效。如果没有更改,解析器将抛出一个异常。

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

<?xml version="1.0"?>
使其成为有效的XML。有了这个改变,你的代码对我有效。如果没有更改,解析器将抛出一个异常。

正如您所给出的,代码编辑似乎没有任何问题:正如svinja指出的,您的声明是错误的,您的xml甚至不会加载到XmlDocument中

但是,我猜您的xml更复杂,并且至少涉及一个名称空间,这将导致select失败

这并不漂亮,但您可以使用与命名空间无关的xpath来定位节点,以避免使用XmlNamespaceManager:

编辑精化

如果将声明更正为

但是,如果在混合中引入名称空间,则除非正确使用名称空间管理器,否则代码将失败

我上面的不可知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>
正如您所说的,您的代码编辑似乎没有任何问题:正如svinja指出的,您的声明是错误的,您的xml甚至不会加载到XmlDocument中

但是,我猜您的xml更复杂,并且至少涉及一个名称空间,这将导致select失败

这并不漂亮,但您可以使用与命名空间无关的xpath来定位节点,以避免使用XmlNamespaceManager:

编辑精化

如果将声明更正为

但是,如果在混合中引入名称空间,则除非正确使用名称空间管理器,否则代码将失败

我上面的不可知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>
并使用标准xmlserializer

并使用标准xmlserializer

尝试设置一个列表:

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;
  }
}
尝试设置一个列表:

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;
  }
}
如果可以,您可以使用LINQ到XML:

如果可以,您可以使用LINQ到XML:



我已经多次遇到这个问题,主要是名称空间问题。你能详细说明你收到的XML的格式吗?这意味着上一个节点XmlNode=doc.SelectSingleNode/abc/xyz;找不到。你确定文档没有名称空间吗?@nonnb这难道不意味着没有找到节点代码,因此他试图访问null的InnerText吗?nonnb这也可能意味着节点丢失,因为他正在询问它的.InnerText。如果出现错误,你的节点为null,请尝试XmlElement root=doc.DocumentElement;XmlNode node=root。选择singlenode./xyz;我已经多次遇到这个问题,主要是名称空间问题。你能详细说明你收到的XML的格式吗?这意味着上一个节点XmlNode=doc.SelectSingleNode/abc/xyz;找不到。你确定文档没有名称空间吗?@nonnb这难道不意味着没有找到节点代码,因此他试图访问null的InnerText吗?nonnb这也可能意味着节点丢失,因为他正在询问它的.InnerText。如果出现错误,你的节点为null,请尝试XmlElement root=doc.DocumentElement;XmlNode node=root。选择singlenode./xyz;如果这是解决方案,很好的发现先生:-@svinja我使用的是第三方api。那么,我如何才能更改xml格式。@svinja抱歉,我写错了,我的xml响应的第一行是,但我得到了错误。为什么?我猜***url***部分有问题。我能看到异常仅在此时抛出的唯一方法是,如果URL中的数据确实包含有效的XML,但没有abc/xyz标记组合。我猜您发布的XML不是您实际XML的准确表示。请尝试发布实际的XML和代码。如果这是解决方案,请注意:先生:-@svinja我使用的是第三方api。那么,我如何才能更改xml格式。@svinja抱歉,我写错了,我的xml响应的第一行是,但我得到了错误。为什么?我猜***url***部分有问题。我能看到异常仅在此时抛出的唯一方法是,如果URL中的数据确实包含有效的XML,但没有abc/xyz标记组合。我猜您发布的XML不是您实际XML的准确表示。尝试发布实际的XML和代码。你能详细说明一下吗。我不明白。我运行了你的代码,但它显示了相同的代码error@Viktor根据svinja的帖子,您的Xml文档甚至不会按原样加载。XmlException“>”是意外标记。所需的令牌是“?>”。您可以吗
详细说明。我不明白。我运行了你的代码,但它显示了相同的代码error@Viktor根据svinja的帖子,您的Xml文档甚至不会按原样加载。XmlException“>”是意外标记。所需的令牌为“?>”。
  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;