XmlNode InnerXml与OuterXml

时间:2014-05-28 18:27:29

标签: xml xmlnode innerxml outerxml

我遇到了一个奇怪的情况,我希望能比我理解得更好的人能帮助我解决它。

我将图像插入Xml文档,以便可以使用Microsoft Word打开它。作为其中的一部分,我需要添加一个Xml'关系'映射到包含图像的元素。直截了当。

我添加了一个如下所示的节点:

<Relationship Id="rId6" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" Target="media/image1.png"  />

但是,在最终的.doc文件中,同一行显示如下:

<Relationship Id="rId6" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" Target="media/image1.png" xmlns="" />

即。它现在有一个空的xmlns =&#34;&#34;属性。

这足以让Word相信文档已损坏并拒绝打开。如果我手动打开文件并删除该属性,则会打开该文件。

显然,我想以编程方式删除它:-)所以我找到了父节点。这是我理解有点朦胧的地方。我相信OuterXml元素包含节点&amp;所有孩子的内容,而InnerXml只包含孩子。

以下是我所看到的内容(请注意,转义字符是因为我已经从Visual Studio中的文本查看器中删除了。)

OuterXml:

"<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">
<Relationship Id=\"rId3\"     Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/webSettings\" Target=\"webSettings.xml\" />
 <Relationship Id=\"rId2\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/settings\" Target=\"settings.xml\" />
<Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\" Target=\"styles.xml\" />
<Relationship Id=\"rId5\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme\" Target=\"theme/theme1.xml\" />
<Relationship Id=\"rId4\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/fontTable\" Target=\"fontTable.xml\" />
<Relationship Id=\"rId6\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image\" Target=\"media/image1.png\" xmlns=\"\" />

</Relationships>"

InnerXml:

"<Relationship Id=\"rId3\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/webSettings\" Target=\"webSettings.xml\" xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\" />
<Relationship Id=\"rId2\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/settings\" Target=\"settings.xml\" xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\" />
<Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\" Target=\"styles.xml\" xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\" />
<Relationship Id=\"rId5\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme\" Target=\"theme/theme1.xml\" xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\" />
<Relationship Id=\"rId4\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/fontTable\" Target=\"fontTable.xml\" xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\" />
<Relationship Id=\"rId6\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image\" Target=\"media/image1.png\" />"

注意第6个和最后一个元素的错误xmlns =&#34;&#34;在OuterXml中,但不在InnerXml中。我可以轻松更改InnerXml,但不能更改OuterXml。

所以,我的最终问题是&#34;我如何摆脱这个增加的属性?&#34;,但我也希望有人可以解释为什么内在的Xml之间存在差异和外部(除容器外)。

1 个答案:

答案 0 :(得分:5)

如何将节点添加到文档中?看起来这种情况正在发生,因为该元素没有命名空间(与其他具有命名空间&#34; http://schemas.openxmlformats.org/package/2006/relationships&#34;)的元素不同。请记住,命名空间并不像#34; normal&#34;属性,对于身份和#34;标签。

在&#34; OuterXml&#34;例如,前5个关系节点都具有与父元素相同的名称空间,因此不需要明确定义它们。第6个节点没有名称空间,因此xmlns =&#34;&#34;

在&#34; InnerXml&#34;例如,前5个节点都具有相同的命名空间,但没有父节点可以继承,它们都明确定义它们。第6个节点仍然具有空白名称空间。

总结:文档因为字符串&#39; xmlns =&#34;&#34;&#39;而损坏,因为一个Relationship元素的名称空间必须为& #34; http://schemas.openxmlformats.org/package/2006/relationships&#34;

为了更好地说明,这里是一个示例xml文档。

<root xmlns="urn:foo:bar" xmlns:ns1="urn:baz">
    <item />
    <ns1:item />
    <item xmlns="" />
</root>
  • 根元素的名称空间是&#34; urn:foo:bar&#34;
  • 第一项元素的命名空间为&#34; urn:foo:bar&#34;
  • 第二个项目元素的命名空间是&#34; urn:baz&#34;
  • 第3项元素的命名空间是&#34;&#34;

如果你要获得&#34;内部xml&#34;根标签可能看起来像这样:

<item xmlns="urn:foo:bar" />
<item xmlns="urn:baz" />
<item xmlns="" />

如上所述,命名空间是标签&#34;身份&#34;的完整部分。或者你想称之为什么。以下文件在功能上完全相同:

<foo:root xmlns:foo="urn:foo" xmlns:bar="urn:bar">
    <foo:element />
    <bar:element />
</foo:root>

<root xmlns="urn:foo" xmlns:bar="urn:bar">
    <element />
    <bar:element />
</root>

<root xmlns="urn:foo">
    <element />
    <element xmlns="urn:bar" />
</root>