我想从文件中读取所有 XML 内容。以下代码仅在删除 XML 声明 ( <?xml version="1.0" encoding="UTF-8"?> ) 时有效。在不删除 XML 声明的情况下读取文件的最佳方法是什么?

XmlTextReader reader = new XmlTextReader(@"c:\my path\a.xml");
            reader.Read();
            string rs = reader.ReadOuterXml();

在不删除 XML 声明的情况下,reader.ReadOuterXml() 返回一个空字符串。
<?xml version="1.0" encoding="UTF-8"?>
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing">
  <s:Header>
    <a:Action s:mustUnderstand="1">http://www.as.com/ver/ver.IClaimver/Car</a:Action>
    <a:MessageID>urn:uuid:b22149b6-2e70-46aa-8b01-c2841c70c1c7</a:MessageID>
    <ActivityId CorrelationId="16b385f3-34bd-45ff-ad13-8652baeaeb8a" xmlns="http://schemas.microsoft.com/2004/09/ServiceModel/Diagnostics">04eb5b59-cd42-47c6-a946-d840a6cde42b</ActivityId>
    <a:ReplyTo>
      <a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address>
    </a:ReplyTo>
    <a:To s:mustUnderstand="1">http://localhost/ver.Web/ver2011.svc</a:To>
  </s:Header>
  <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <Car xmlns="http://www.as.com/ver">
      <carApplication>
        <HB_Base xsi:type="HB" xmlns="urn:core">
          <Header>
            <Advisor>
              <AdvisorLocalAuthorityCode>11</AdvisorLocalAuthorityCode>
              <AdvisorType>1</AdvisorType>
            </Advisor>
          </Header>
          <General>
            <ApplyForHB>yes</ApplyForHB>
            <ApplyForCTB>yes</ApplyForCTB>
            <ApplyForFSL>yes</ApplyForFSL>
            <ConsentSupplied>no</ConsentSupplied>
            <SupportingDocumentsSupplied>no</SupportingDocumentsSupplied>
          </General>
        </HB_Base>
      </carApplication>
    </Car>
  </s:Body>
</s:Envelope>

更新

我知道其他使用非 xml 阅读器的方法(例如,通过使用 File.ReadAllText()) 。但我需要知道一种使用 xml 方法的方法。

最佳答案

除了 BOM 之外,<?xml ?> 编码声明之前不能有任何文本或空格,并且声明和除换行符之外的根元素之间不能有任何文本。

其他任何内容都是无效文件。

更新:

我认为您对 XmlTextReader.read() 的期望是不正确的。

每次调用 XmlTextReader.Read() 都会遍历 XML 文档中的下一个“标记”, 一次一个标记。 “ token ”表示 XML 元素、空格、文本和 XML 编码声明。

您对 reader.ReadOuterXML() 的调用返回一个空字符串,因为 XML 文件中的第一个标记是 XML 声明,而 XML 声明没有 OuterXML。

考虑这个代码:

    XmlTextReader reader = new XmlTextReader("test.xml");
    reader.Read();
    Console.WriteLine(reader.NodeType);  // XMLDeclaration
    reader.Read();
    Console.WriteLine(reader.NodeType);  // Whitespace
    reader.Read();
    Console.WriteLine(reader.NodeType);  // Element
    string rs = reader.ReadOuterXml();

上面的代码产生这个输出:
XmlDeclaration
Whitespace
Element

第一个“标记”是 XML 声明。

遇到的第二个“标记”是 XML 声明之后的换行符。

遇到的第三个“ token ”是 <s:Envelope> 元素。从这里调用 reader.ReadOuterXML() 将返回我认为您希望看到的内容 - <s:Envelope> 元素的文本,它是整个肥皂包。

如果您真正想要的是将 XML 文件作为对象加载到内存中,只需调用
var doc = XDocument.Load("test.xml")并一举完成解析。

除非您使用的 XML 文档非常庞大,以至于无法放入系统内存中,否则真的没有太多理由一次一个标记地浏览 XML 文档。

关于c# - 无需删除 XML 声明即可读取 XML 文件的内容,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8538887/

10-17 02:07