【问题标题】:Can't load XmlReader into XDocument无法将 XmlReader 加载到 XDocument
【发布时间】:2009-07-15 20:02:57
【问题描述】:

我正在尝试将XmlReader 加载到XDocument 中以便于操作。 XML 格式正确且有效(我仔细检查了)。当我尝试将其加载到XDocument 时,我得到一个InvalidOperationException

此操作后 XmlReader 状态应为 EndOfFile。

加载这个的代码是

public void ReadXml(System.Xml.XmlReader reader)
{
    var doc = XDocument.Load(reader);
}

我已包含导致问题的 XML 示例。我可以毫无问题地序列化和反序列化这个类,但不能加载它。有什么想法吗?

<?xml version="1.0" encoding="utf-8"?>
<ForestView xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"       
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Forest>
 <TreeNodeView>
  <Level>Master</Level>
  <ID>39476b1f-e2f8-4d76-b82e-a5166899ad43</ID>
  <Name>Black Mesa</Name>
  <ServerIPAddress>127.0.0.1</ServerIPAddress>
  <ServerPortNumber>8000</ServerPortNumber>
  <ClientIPAddress>NA</ClientIPAddress>
  <ClientPortNumber>4000</ClientPortNumber>
  <Nodes>
    <Level>Server</Level>
    <NodeID>062c3e03-235d-4d7d-9b60-c6228c9cc89e</NodeID>
    <Name />
    <ServerIPAddress>127.0.0.1</ServerIPAddress>
    <ServerPortNumber>5000</ServerPortNumber>
    <ClientIPAddress>127.0.0.1</ClientIPAddress>
    <ClientPortNumber>4000</ClientPortNumber>
  </Nodes>
  <Nodes>
    <Level>Intermediate</Level>
    <NodeID>9bafdc9e-771e-42cf-8f03-e7e75a67a6d1</NodeID>
    <Name>Jen</Name>
    <ServerIPAddress>127.0.0.1</ServerIPAddress>
    <ServerPortNumber>8001</ServerPortNumber>
    <ClientIPAddress>127.0.0.1</ClientIPAddress>
    <ClientPortNumber>8000</ClientPortNumber>
    <Nodes>
      <Level>Terminal</Level>
      <NodeID>72509141-0ab8-45c1-8042-30afb233b4a8</NodeID>
      <Name>Mary</Name>
      <ServerIPAddress>127.0.0.1</ServerIPAddress>
      <ServerPortNumber>0</ServerPortNumber>
      <ClientIPAddress>127.0.0.1</ClientIPAddress>
      <ClientPortNumber>8001</ClientPortNumber>
    </Nodes>
   </Nodes>
  </TreeNodeView>
 </Forest>
</ForestView>

【问题讨论】:

  • 这个sn-p没什么问题。您能否发布您实例化 XmlReader 并调用 ReadXml 方法的代码?
  • 请显示进行调用的代码,并显示完整的异常。
  • 请同时显示用于创建XmlReader 的代码,并传递给XDocument.Load

标签: c# linq-to-xml


【解决方案1】:

很晚的答案,以防有人遇到同样的问题。 您可以通过在阅读器上使用ReadSubtree() 来修复它,例如:

public void ReadXml(System.Xml.XmlReader reader)
{
     var doc = XDocument.Load(reader.ReadSubtree());
}

【讨论】:

    【解决方案2】:

    这个错误意味着在阅读器加载了它认为是 XML 文档之后有额外的数据。请确认您的 XML 文件在最后一个关闭元素之后不包含任何数据,并且 XmlReader 已初始化为从根元素或文件开头读取,没有其他内容。

    【讨论】:

      【解决方案3】:

      另一个迟到的答案,但我遇到了reader.ReadSubtree() 解决方法的问题,这最终适用于我的情况。基本方法是读入一个字符串,然后调用XDocument.Parse():

      XDocument doc;
      var textReader = reader as XmlTextReader;
      if (textReader != null)
      {
          var xml = textReader.ReadOuterXml();
          doc = XDocument.Parse(xml);
      }
      else
          doc = XDocument.Load(reader); 
      

      【讨论】:

      • 此解决方案返回错误:“此操作将创建结构不正确的文档”
      • 在这种情况下,您的 XML 可能是错误的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-09
      • 1970-01-01
      相关资源
      最近更新 更多