从流中加载XmlDocument时缺少根元素

时间:2011-07-05 14:13:59

标签: c# .net xml exception-handling

我有以下代码:

var XmlDoc = new XmlDocument();
Console.WriteLine();
Console.WriteLine(response.ReadToEnd());
Console.WriteLine();

// setup the XML namespace manager
XmlNamespaceManager mgr = new XmlNamespaceManager(XmlDoc.NameTable);
// add the relevant namespaces to the XML namespace manager
mgr.AddNamespace("ns", "http://triblue.com/SeriousPayments/");
XmlDoc.LoadXml(response.ReadToEnd());
XmlElement NodePath = (XmlElement)XmlDoc.SelectSingleNode("/ns:Response", mgr);

while (NodePath != null)
  {
      foreach (XmlNode Xml_Node in NodePath)
      {
          Console.WriteLine(Xml_Node.Name + " " + Xml_Node.InnerText);
      }
  }

我得到了:

  

缺少根元素。

在:

XmlDoc.LoadXml(response.ReadToEnd());

我的XML看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<Response xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://triblue.com/SeriousPayments/">
    <Result>0</Result>
    <Message>Pending</Message>
    <PNRef>230828</PNRef>
    <ExtData>InvNum=786</ExtData>
</Response>

我迷路了。有人能告诉我我做错了什么吗?我知道我之前有这个工作,所以我不确定我搞砸了什么。

一如既往,谢谢!

*我得到答案后编辑的原因 * *

我需要更改一行:

XmlElement NodePath = (XmlElement)XmlDoc.SelectSingleNode("/ns:Response");

为:

XmlElement NodePath = (XmlElement)XmlDoc.SelectSingleNode("/ns:Response", mgr);

没有它,这是行不通的。

4 个答案:

答案 0 :(得分:14)

您似乎正在阅读response流两次。它不起作用,你第二次得到一个空字符串。删除行Console.WriteLine(response.ReadToEnd());或将响应保存为字符串:

string responseString = response.ReadToEnd();
…
Console.WriteLine(reponseString);
…
XmlDoc.LoadXml(responseString);

答案 1 :(得分:4)

您应该将XML读取器输入存储在字符串变量中,因为第二次调用ReadToEnd()方法时,它无法从流中读取任何内容,因为它已经在最后并返回一个空字符串。

string responseString = response.ReadToEnd()

答案 2 :(得分:1)

当你打电话时

Console.WriteLine(response.ReadToEnd()); 它会在第二次读取所有响应内容时读取它agiin

string responsecontent=response.ReadToEnd();

并在任何地方使用responsecontent

答案 3 :(得分:0)

反序列化时,将deserializeRootElementName用作“ root”

XmlDocument xmlResponse = JsonConvert.DeserializeXmlNode(response,“ root”);