我遇到了一个奇怪的情况,我希望比我更了解的人可以帮助我解决它。
我正在将图像插入到 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=""属性。
这足以让 Word 认为文档已损坏并拒绝打开。如果我手动打开文件并删除该属性,文件将打开。
很明显,我想以编程方式删除它:-) 所以我找到了父节点。这是我的理解有点模糊的地方。我相信 OuterXml 元素包含节点及其所有子项的内容,而 InnerXml 只包含子项。
这是我所看到的(请注意,转义字符是因为我从 Visual Studio 中的文本查看器中剪切的)。
外层XML:
"<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 个也是最后一个元素如何在 OuterXml 中有错误的 xmlns="",但在 InnerXml 中却没有。我可以轻松更改 InnerXml,但不能更改 OuterXml。
所以,我的最终问题是“如何摆脱这个添加的属性?”,但我也希望有人能解释为什么内部和外部的 Xml 之间存在差异(容器除外) .
最佳答案
如何将节点添加到文档中?看起来这是因为该元素没有 namespace (与 namespace 为“http://schemas.openxmlformats.org/package/2006/relationships”的其他元素不同)。请记住,命名空间不像“普通”属性,它对于标记的“身份”至关重要。
在“OuterXml”示例中,前 5 个关系节点都具有与父元素相同的命名空间,因此不需要显式定义。第 6 个节点没有 namespace ,因此 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”
- 第二个item元素的命名空间是“urn:baz”
- 第3项元素的命名空间是“”
如果您要获取根标记的“内部 xml”,它可能看起来像这样:
<item xmlns="urn:foo:bar" />
<item xmlns="urn:baz" />
<item xmlns="" />
如上所述, namespace 是标记“身份”或任何您想要调用的名称的组成部分。以下文档在功能上都是相同的:
<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>
关于XmlNode InnerXml 与 OuterXml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23919195/