XmlNode InnerXml与OuterXml的区别

6

我遇到了一个奇怪的情况,希望能有比我更懂的人帮助我解决。

我正在将一张图片插入到 Xml 文档中,以便可以在 Microsoft Word 中打开。为此,我需要添加一个映射到包含该图片的元素的 Xml“关系”(Relationship)。很直观。

我正在添加一个节点,应该长这样:

<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=""属性。

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

显然,我想以编程方式删除它 :-) 所以我找到了父节点。这是我理解有些模糊的地方。我认为OuterXml元素包含节点及其所有子项的内容,而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\" />"

请注意第六个也是最后一个元素,在OuterXml中有错误的xmlns="",但在InnerXml中没有。我可以轻松更改InnerXml,但无法更改OuterXml。
因此,我的最终问题是“如何摆脱这个添加的属性?”,但我也希望有人能解释一下内部和外部Xml之间的区别(除了容器)。
1个回答

5
你是如何将节点添加到文档中的?看起来这是因为该元素没有命名空间(与其他元素不同,其他元素的命名空间为“http://schemas.openxmlformats.org/package/2006/relationships”)。请记住,命名空间不像“普通”的属性,对于标签的“身份”至关重要。
在“OuterXml”示例中,前5个Relationship节点都具有与父元素相同的命名空间,因此不需要显式定义。第6个节点没有命名空间,因此xmlns =“”。
在“InnerXml”示例中,前5个节点都具有相同的命名空间,但由于没有父级继承,它们每个都明确定义了它。第6个节点仍然具有空白命名空间。
总之:文档并不因字符串“xmlns =”“而损坏,而是因为Relationship元素必须具有命名空间“http://schemas.openxmlformats.org/package/2006/relationships”。
为了更好地说明问题,这里是一个示例XML文档。
<root xmlns="urn:foo:bar" xmlns:ns1="urn:baz">
    <item />
    <ns1:item />
    <item xmlns="" />
</root>
  • 根元素的命名空间为"urn:foo:bar"
  • 第一个项目元素的命名空间为"urn:foo:bar"
  • 第二个项目元素的命名空间为"urn:baz"
  • 第三个项目元素的命名空间为空

如果您获取根标记的"inner xml",它可能看起来像这样:

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

如上所述,命名空间是标签“身份”或其他你想称呼的部分的重要组成部分。下面这些文档在功能上都是相同的:
<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>

你真是个超级巨星。我忽略了这一点。我添加了关系命名空间,它立即起作用了。非常感谢! - user1711233

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接