XmlNode InnerXml与OuterXml

use*_*233 6 xml innerxml xmlnode outerxml

我遇到了一个奇怪的情况,希望有一个比我了解得更多的人可以帮助我解决这个问题。

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

我添加的节点应如下所示:

<Relationship Id="rId6" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" Target="media/image1.png"  />
Run Code Online (Sandbox Code Playgroud)

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

<Relationship Id="rId6" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" Target="media/image1.png" xmlns="" />
Run Code Online (Sandbox Code Playgroud)

即它现在具有一个空的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>"
Run Code Online (Sandbox Code Playgroud)

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\" />"
Run Code Online (Sandbox Code Playgroud)

请注意,第6个元素也是最后一个元素在OuterXml中有错误的xmlns =“”,但在InnerXml中却没有。我可以轻松更改InnerXml,但不能更改OuterXml。

因此,我的最终问题是“如何摆脱这个添加的属性?”,但我也希望有人能解释为什么内部和外部Xml(除了容器)之间存在差异。

Der*_*rek 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>
Run Code Online (Sandbox Code Playgroud)
  • 根元素的名称空间是“ urn:foo:bar”
  • 第一项元素的名称空间是“ urn:foo:bar”
  • 第二项元素的名称空间是“ urn:baz”
  • 第三项元素的名称空间是“”

如果要获取根标记的“内部xml”,它可能看起来像这样:

<item xmlns="urn:foo:bar" />
<item xmlns="urn:baz" />
<item xmlns="" />
Run Code Online (Sandbox Code Playgroud)

如上所述,名称空间是标签“身份”或您要调用的任何内容的组成部分。以下文档在功能上完全相同:

<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>
Run Code Online (Sandbox Code Playgroud)