如何在 MSXML IXMLDOMDocument2 中保存和访问处理指令

Posted

技术标签:

【中文标题】如何在 MSXML IXMLDOMDocument2 中保存和访问处理指令【英文标题】:How to preserve and access processing instructions in MSXML IXMLDOMDocument2 【发布时间】:2021-03-09 10:41:32 【问题描述】:

我有这个问题,我需要访问 MSXML IXMLDOMDocument2 接口中的处理指令。 是否可以执行XMLDocument.load() 并访问xml-stylesheet 指令? 如果是,怎么做才对?

我有 xml:

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="transform.xsl"?>
...

我需要提取 xml-stylesheet href 值。 但是XMLDocumentXMLDocument.load()操作后似乎不包含这个处理指令。 所以我做不到:

XMLDocument.transformNode(XSLDocument);

XSLDocument 填充了 transform.xsl 内部的内容,因为我不知道 transform.xsl 的位置。

感谢您的帮助。

【问题讨论】:

那么您尝试过什么,您认为“但是 XMLDocument 在 XMLDocument.load() 操作之后似乎不包含此处理指令”?我认为 XMLDocument.childNodes 包含该处理指令,我不记得微软是否将 XML 声明放在 DOM 中,如果没有,XMLDocument.firstChild.data 应该给你我认为的type="text/xsl" href="transform.xsl" 值。跨度> 如果使用 XPath 作为选择语言,XMLDocument.selectSingleNode("processing-instruction('xml-stylesheet')").data 也应该可以工作(即默认情况下在 MSXML 6 中或通过首先使用 MSXML 3 XMLDocument.setProperty("SelectionLanguage", "XPath") 设置它。 搜索时使用XMLDocument.documentElement,没有这样的元素。 我不明白对 documentElement 的引用,这会给你 XML 的根元素,例如对于&lt;root&gt;&lt;foo&gt;...&lt;/foo&gt;&lt;/root&gt; root 元素,例如&lt;html&gt;&lt;body&gt;...&lt;/body&gt;&lt;/html&gt; html 元素节点。 xml-stylesheet 位于根元素之前。 @MartinHonnen - 哦,是的,你说得对,在这工作一整天之后,我似乎很累了。谢谢,请把你的答案放在下面,这样我就可以检查它作为解决方案。 【参考方案1】:

假设 MSXML 没有将 XML 声明建模为节点(我认为它没有,但我不确定)你应该能够访问处理指令,因为 XMLDocument.firstChildXMLDocument.firstChild.data 给你然后处理指令的“值”,即完整字符串type="text/xsl" href="transform.xsl"

您还应该能够使用 XPath 和 XMLDocument.selectSingleNode("processing-instruction('xml-stylesheet')").data 选择节点,只有 XPath 不是 MSXML 3 中的默认选择语言(仅在 MSXML 6 中),因此对于 MSXML 3,您需要首先设置 XMLDocument.setProperty("SelectionLanguage", "XPath")

【讨论】:

一个补充,经过测试,似乎data字段在MSXML的Delphi 2010实现中不存在,但字段nodeValue包含我需要的所有内容,即:XMLDocument.firstChild.nodeValue返回所有属性。

以上是关于如何在 MSXML IXMLDOMDocument2 中保存和访问处理指令的主要内容,如果未能解决你的问题,请参考以下文章

怎么用C语言写一个简单的XML文件

如何安装MSXML4.0

如何使用MSXML3 SP7

如果安装了 MSXML 4.0,我如何检查 Inno Setup?

如何强制 WinInet 和 MSXML 使用 TLS1.0

如何使用 MSXML 针对 XML Schema.xsd 验证我自己的 Schema XSD 文件?