我遇到了一个奇怪的情况,我希望有比我更了解的人能帮助我解决这个问题。
我正在将图像插入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的文本查看器中剪切了)。
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个也是最后一个元素在OuterXml中有错误的xmlns=",而在InnerXml中没有。我可以很容易地改变InnerXml,但不能改变OuterXml。
所以,我的最终问题是"我如何摆脱这个添加的属性?",但我也希望有人能解释为什么内部和外部(除了容器)的Xml之间存在差异。
如何将节点添加到文档中?之所以会发生这种情况,是因为该元素没有名称空间(不像其他元素有名称空间"http://schemas.openxmlformats.org/package/2006/relationships")。请记住,名称空间不像"普通"属性,它对标记的"身份"至关重要。
在"OuterXml"示例中,前5个Relationship节点都具有与父元素相同的名称空间,因此不需要显式定义。第6个节点没有名称空间,因此xmlns="
在"InnerXml"的例子中,前5个节点都有相同的命名空间,但是没有父节点可以继承,它们都显式地定义了它。第6个节点仍然有空白命名空间。
总而言之:文档不是因为字符串'xmlns="'而损坏的,它是由于关系元素必须有一个命名空间为"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"
- 第一个item元素的命名空间是"urn:foo:bar"
- 第二个item元素的命名空间是"urn:baz"
- 第三个item元素的命名空间是"
如果你想获得根标签的"内部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>