- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我遇到了一个奇怪的情况,我希望比我更了解的人可以帮助我解决它。
我正在将图像插入到 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>
如果您要获取根标记的“内部 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/
我有一个 XmlDocument,我想将内容 (OuterXml) 作为 pretty-print 字符串获取。我该怎么做? 问候 最佳答案 假设我理解正确 using System.Xml.Linq
我正在尝试使用 log4net 记录来自 WCF 服务的一些 XML 响应。 我希望 XML 文件以正确格式的 XML 格式输出到日志。请求以 XMLElement 的形式出现。 例子: 请求是这样的
我遇到了一个奇怪的情况,我希望比我更了解的人可以帮助我解决它。 我正在将图像插入到 Xml 文档中,以便可以使用 Microsoft Word 打开它。作为其中的一部分,我需要添加一个映射到包含图像的
我知道如何使用 OpenXmlElement.OuterXml 函数将 OpenXmlElement 转换为外部 xml,但是是否可以在不知道它将成为哪种 OpenXmlElement 的情况下执行相
我需要构建一个 WCF 服务。我成功了。它给了我以下输出结果。 结果输出: -8 -8 0 此服务将由一家金融机构使用。他们要求稍微改变一下结果
我有一个使用输入流的 Go 程序,即 os.Stdin : 一个非常大的 XML 文件,所以我无法一次处理所有文件。 我想提取特定性质的所有 XML 元素进行后期处理。 我可以毫不费力地识别要提取的元
我有一个包含以下 XML 的 XmlDocument 对象: 以字符串形式接收 XML 文档的客户端应用程序要求元素具有“pre:”前缀。 我的问题是,当我使用 .Out
我正在尝试将一些使用 XmlDocument 类的代码重构为 Linq To Xml。但是,我不确定 XDocument 中 innerXml 和 outerXml 的对应物是什么? 最佳答案 根据
我有一个带有以下签名的 Web 方法(在 SOAP Web 服务中): public msgResponse myWebMethod([XmlAnyElement] XmlElement msgReq
使用 IE 时,以下工作 - alert("XML Root IE: " + xmlDoc.documentElement.tagName); // ok alert("Xml: " + xmlD
我是一名优秀的程序员,十分优秀!