我遇到了一个奇怪的情况,我希望能比我理解得更好的人能帮助我解决它。
我将图像插入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 =&#34;&#34;属性。
这足以让Word相信文档已损坏并拒绝打开。如果我手动打开文件并删除该属性,则会打开该文件。
显然,我想以编程方式删除它:-)所以我找到了父节点。这是我理解有点朦胧的地方。我相信OuterXml元素包含节点&amp;所有孩子的内容,而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个和最后一个元素的错误xmlns =&#34;&#34;在OuterXml中,但不在InnerXml中。我可以轻松更改InnerXml,但不能更改OuterXml。
所以,我的最终问题是&#34;我如何摆脱这个增加的属性?&#34;,但我也希望有人可以解释为什么内在的Xml之间存在差异和外部(除容器外)。
答案 0 :(得分:5)
如何将节点添加到文档中?看起来这种情况正在发生,因为该元素没有命名空间(与其他具有命名空间&#34; http://schemas.openxmlformats.org/package/2006/relationships&#34;)的元素不同。请记住,命名空间并不像#34; normal&#34;属性,对于身份和#34;标签。
在&#34; OuterXml&#34;例如,前5个关系节点都具有与父元素相同的名称空间,因此不需要明确定义它们。第6个节点没有名称空间,因此xmlns =&#34;&#34;
在&#34; InnerXml&#34;例如,前5个节点都具有相同的命名空间,但没有父节点可以继承,它们都明确定义它们。第6个节点仍然具有空白名称空间。
总结:文档因为字符串&#39; xmlns =&#34;&#34;&#39;而损坏,因为一个Relationship元素的名称空间必须为& #34; http://schemas.openxmlformats.org/package/2006/relationships&#34;
为了更好地说明,这里是一个示例xml文档。
<root xmlns="urn:foo:bar" xmlns:ns1="urn:baz">
<item />
<ns1:item />
<item xmlns="" />
</root>
如果你要获得&#34;内部xml&#34;根标签可能看起来像这样:
<item xmlns="urn:foo:bar" />
<item xmlns="urn:baz" />
<item xmlns="" />
如上所述,命名空间是标签&#34;身份&#34;的完整部分。或者你想称之为什么。以下文件在功能上完全相同:
<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>