Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.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# XML文档SelectSingleNode返回null_C#_Xml - Fatal编程技术网

C# XML文档SelectSingleNode返回null

C# XML文档SelectSingleNode返回null,c#,xml,C#,Xml,我正在尝试从流阅读器读取XML,同时也得到了响应XML。但当我试图读取它的节点时,它总是返回null var request = (HttpWebRequest) WebRequest.Create(address); var response = (HttpWebResponse) request.GetResponse(); var stream = response.GetResponseStream(); if(stream != null) { var xmlReader =

我正在尝试从流阅读器读取XML,同时也得到了响应XML。但当我试图读取它的节点时,它总是返回null

var request = (HttpWebRequest) WebRequest.Create(address);
var response = (HttpWebResponse) request.GetResponse();
var stream = response.GetResponseStream();

if(stream != null)
{
   var xmlReader = new XmlTextReader(stream);
   var xmlDocument = new XmlDocument();
   xmlDocument.Load(xmlReader);
   var node = xmlDocument.SelectSingleNode("RateQuote");
}
XML文档

<RateQuoteResponse xmlns="http://ratequote.usfnet.usfc.com/v2/x1">
  <STATUS>
   <CODE>0</CODE>
   <VIEW>SECURED</VIEW>
   <VERSION>...</VERSION>
  </STATUS>
 <RateQuote>
   <ORIGIN>
     <NAME>KNOXVILLE</NAME>
     <CARRIER>USF Holland, Inc</CARRIER>
     <ADDRESS>5409 N NATIONAL DR</ADDRESS>
     <CITY>KNOXVILLE</CITY>
     <STATE>TN</STATE>
     <ZIP>37914</ZIP>
     <PHONE>8664655263</PHONE>
     <PHONE_TOLLFREE>8006545963</PHONE_TOLLFREE>
     <FAX>8656379999</FAX>
  </ORIGIN>
  <DESTINATION>
     <NAME>KNOXVILLE</NAME>
     <CARRIER>USF Holland, Inc</CARRIER>
     <ADDRESS>5409 N NATIONAL DR</ADDRESS>
     <CITY>KNOXVILLE</CITY>
     <STATE>TN</STATE>
     <ZIP>37914</ZIP>
     <PHONE>8664655263</PHONE>
     <PHONE_TOLLFREE>8006545963</PHONE_TOLLFREE>
     <FAX>8656379999</FAX>
  </DESTINATION>
     <ORIGIN_ZIP>37914</ORIGIN_ZIP>
     <DESTINATION_ZIP>37909</DESTINATION_ZIP>
     <TOTAL_COST>99.24</TOTAL_COST>
     <SERVICEDAYS>1</SERVICEDAYS>
     <INDUSTRYDAYS>1.6</INDUSTRYDAYS>
     <CLASSWEIGHT>
        <CLASS>55</CLASS>
        <ASCLASS>50</ASCLASS>
        <WEIGHT>100</WEIGHT>
        <CHARGES>0.0</CHARGES>
     </CLASSWEIGHT>
</RateQuote>
</RateQuoteResponse>

XML文档使用默认命名空间“”。您需要更改
SelectSingleNode
调用以使用此命名空间

您需要设置一个namspace管理器,然后将其提供给
SelectSingleNode

var nsmgr = new XmlNamespaceManager(doc.NameTable);
nsmgr.AddNamespace("rate", "http://ratequote.usfnet.usfc.com/v2/x1");
var node = xmlDocument.SelectSingleNode("//rate:RateQuote", nsmgr);
编辑
RateQuoteResponse
元素有一个默认名称空间
xmlns=“…”
。这意味着所有元素也使用这个名称空间,除非被特别重写。

问题是,您要求的是一个没有名称空间的
RateQuote
元素,而
RateQuote
元素实际上在具有URI的名称空间中
http://ratequote.usfnet.usfc.com/v2/x1

您可以使用
XmlNamespaceManager
在XPath中寻址名称空间,也可以使用具有非常简单的名称空间处理的LINQ to XML:

var document = XDocument.Load(stream);
XNamespace ns = "http://ratequote.usfnet.usfc.com/v2/x1";
XElement rateQuote = document.Root.Element(ns + "RateQuote");
就我个人而言,如果可能的话,我会使用linqtoxml,我发现它比
XmlDocument
更易于使用。当然,如果愿意,您仍然可以使用XPath,但我个人更喜欢使用查询方法

编辑:请注意,命名空间默认值也适用于子元素。因此,要找到总成本,您需要:

XElement cost = document.Root
                        .Element(ns + "RateQuote")
                        .Element(ns + "TOTAL_COST");

您可以在读取文件时删除名称空间,只需在XmlTextReader上禁用名称空间:

var request = (HttpWebRequest) WebRequest.Create(address);
var response = (HttpWebResponse) request.GetResponse();
var stream = response.GetResponseStream();

if(stream != null)
{
   var xmlReader = new XmlTextReader(stream);
   xmlReader.Namespaces = false;
   var xmlDocument = new XmlDocument();
   xmlDocument.Load(xmlReader);
   var node = xmlDocument.SelectSingleNode("RateQuote");
}

之后,在XML元素上使用XPath/LINQ时,您不必关心名称空间。

您还应该能够做到:

...
var node = xmlDocument["RateQuote"];
...
其VB语法为:

...
Dim node as XmlNode = xmlDocument("RateQuote")
...

您可能希望在XmlTextReader中将名称空间设置为false

因此,在代码中,更改:

var xmlReader = new XmlTextReader(stream);


通过此更改,您应该能够使用SelectSingleNode获得所需的节点,而不必使用名称空间。

谢谢,您可以发布
LINQ
代码示例来选择
RateQuote
节点吗?@SSS:这是我发布的代码-
RateQuote
变量引用
元素。谢谢,xml文档加载失败,并引发错误,因为在
var document=XDocument.load(stream)行中未找到根元素
@SSS:这表明您已经使用了该流。在将其加载到XmlDocument中之后,您是否也在尝试执行此操作?仅我添加的代码就出现了此错误。我不知道你在问什么抱歉
var node=xmlDocument.SelectSingleNode(//rate:RateQuote/TOTAL_COST),nsmgr)为什么这不起作用?它再次抛出
null
@SSS:您又遇到了同样的问题,
TOTAL\u COST
元素也在该名称空间中。(我正在编辑我的答案以提及这一点。)谢谢。我有时想知道开发这些API的人是否真的尝试过使用它们!或忘记所有这些糟糕的名称空间,改用XPath:)
xmlDocument.SelectSingleNode(String.Format(“/*[local-name()='{0}']”,nodeName))var xmlReader = new XmlTextReader(stream) { Namespaces = false };