繁体   English   中英

XML DocumentElement正在破坏innerXml

[英]XML DocumentElement is trashing the innerXml

我有一个简单的XML文件,如下所示,当通过基本的XmlDocument.Load(filename.xml)读入时。 如果我加载文件,并检查它的innerXML,它看起来都很正常。 但是,当我检查DocumentElement的值时,它很乱! 我保持这个例子很小,所以你可以很容易地看到没有畸形:

<?xml version="1.0" encoding="UTF-8"?>
<fax:FaxService xmlns:fax="http://www.hp.com/schemas/imaging/con/service/fax/2009/02/11/" xmlns:dd="http://www.hp.com/schemas/imaging/con/dictionaries/1.0/">
  <fax:ServiceDefaults>
    <fax:ServiceSendDefaults>
      <fax:InternetFaxSettings>
        <dd:FaxFileFormat>MTIFFG4</dd:FaxFileFormat>
        <dd:UseEmailAsFaxAcctAddr>false</dd:UseEmailAsFaxAcctAddr>
        <dd:AutoCompleteToNANP>false</dd:AutoCompleteToNANP>
        <dd:RetryInterval>0</dd:RetryInterval>
        <dd:MaxRetryAttempts>0</dd:MaxRetryAttempts>
      </fax:InternetFaxSettings>
    </fax:ServiceSendDefaults>
  </fax:ServiceDefaults>
</fax:FaxService>

现在,使用以下简单代码在C#中尝试:

...

XmlDocument xDoc = new XmlDocument();
xDoc.Load("*XMLSAMPLE.XML*");

textBox1.Text = xDoc.InnerXml;
textBox2.Text = xDoc.DocumentElement.InnerXml;

...

它完全被破坏了,第二个命名空间重复了每个dd标记,甚至没有包含在最顶层的标记中。

我究竟做错了什么? 这让我疯了!

xDoc.DocumentElement.InnerXml返回的内容在语义上与原始ServiceDefaults标记相同 - 如果第一个片段符合XML模式,则InnerXml片段也将符合内部元素的定义。 仅仅因为框架重新安排了命名空间声明并没有改变文档的语义。

比较两个XmlDocument属性的输出

xDoc.DocumentElement

<?xml version="1.0" encoding="UTF-8"?>
   <fax:FaxService xmlns:fax="http://www.hp.com/schemas/imaging/con/service/fax/2009/02/11/" xmlns:dd="http://www.hp.com/schemas/imaging/con/dictionaries/1.0/">
    <fax:ServiceDefaults>
     <fax:ServiceSendDefaults>
      <fax:InternetFaxSettings>
        <dd:FaxFileFormat>MTIFFG4</dd:FaxFileFormat>
        <dd:UseEmailAsFaxAcctAddr>false</dd:UseEmailAsFaxAcctAddr>
        <dd:AutoCompleteToNANP>false</dd:AutoCompleteToNANP>
        <dd:RetryInterval>0</dd:RetryInterval>
        <dd:MaxRetryAttempts>0</dd:MaxRetryAttempts>
      </fax:InternetFaxSettings>
     </fax:ServiceSendDefaults>
    </fax:ServiceDefaults>
  </fax:FaxService>

xDoc.DocumentElement.InnerXml

<fax:ServiceDefaults xmlns:fax="http://www.hp.com/schemas/imaging/con/service/fax/2009/02/11/">
  <fax:ServiceSendDefaults>
   <fax:InternetFaxSettings>
     <dd:FaxFileFormat xmlns:dd="http://www.hp.com/schemas/imaging/con/dictionaries/1.0/">MTIFFG4</dd:FaxFileFormat>
     <dd:UseEmailAsFaxAcctAddr xmlns:dd="http://www.hp.com/schemas/imaging/con/dictionaries/1.0/">false</dd:UseEmailAsFaxAcctAddr>
     <dd:AutoCompleteToNANP xmlns:dd="http://www.hp.com/schemas/imaging/con/dictionaries/1.0/">false</dd:AutoCompleteToNANP>
     <dd:RetryInterval xmlns:dd="http://www.hp.com/schemas/imaging/con/dictionaries/1.0/">0</dd:RetryInterval>
     <dd:MaxRetryAttempts xmlns:dd="http://www.hp.com/schemas/imaging/con/dictionaries/1.0/">0</dd:MaxRetryAttempts>
   </fax:InternetFaxSettings>
  </fax:ServiceSendDefaults>
 </fax:ServiceDefaults>

查看MSDN中的以下链接将有助于了解您的情况:
http://msdn.microsoft.com/en-us/library/system.xml.xmldocument.innerxml.aspx

基本上, xDoc.DocumentElement.InnerXml正在查看<fax:ServiceDefaults>节点,而xDoc.InnerXml看起来高一级( FaxService节点)。 这是理解你的问题的关键-因为所有的xmlns是上FaxService节点。

对XML文档进行以下更改,并注意发生的情况(基本上,将xmlns信息复制到ServiceDefaults节点:

<?xml version="1.0" encoding="UTF-8"?>
<fax:FaxService xmlns:fax="http://www.hp.com/schemas/imaging/con/service/fax/2009/02/11/" xmlns:dd="http://www.hp.com/schemas/imaging/con/dictionaries/1.0/">
  <fax:ServiceDefaults xmlns:fax="http://www.hp.com/schemas/imaging/con/service/fax/2009/02/11/" xmlns:dd="http://www.hp.com/schemas/imaging/con/dictionaries/1.0/">
    <fax:ServiceSendDefaults>
      <fax:InternetFaxSettings>
        <dd:FaxFileFormat>MTIFFG4</dd:FaxFileFormat>
        <dd:UseEmailAsFaxAcctAddr>false</dd:UseEmailAsFaxAcctAddr>
        <dd:AutoCompleteToNANP>false</dd:AutoCompleteToNANP>
        <dd:RetryInterval>0</dd:RetryInterval>
        <dd:MaxRetryAttempts>0</dd:MaxRetryAttempts>
      </fax:InternetFaxSettings>
    </fax:ServiceSendDefaults>
  </fax:ServiceDefaults>
</fax:FaxService>

突然间,您的代码将根据您的期望行事。 所以希望这可以帮助您理解问题。 永久修复应该是什么,这取决于你。

HTH!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM