XmlNode InnerXml 与 OuterXml

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

这足以让 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/

相关文章:

sql-server - SQL Server 将 XML 子节点 append 到父节点

.net - 获取 XElement 的 InnerXml 的最佳方法?

css - XSLT与CSS显示XML

java - 无法运行maven javafx应用程序并且pom文件中出现一些错误

c# - 需要解析一个xml字符串

ios - 尝试使用 swift 将 XML 从 URL 解析为 PickerView

VB.net 中属性的 Xml 节点值

c# - 使用 XmlNode 读取嵌套的 XML