【问题标题】:Selecting an XML comment node using MSXML使用 MSXML 选择 XML 注释节点
【发布时间】:2014-06-23 16:15:55
【问题描述】:

目前,我无法访问我试图从中读取的 XSD 中任何 cmets 的内容。

这是我试图从中读取 cmets 的 XSD 的 sn-p:

<xs:schema>
    <xs:complexType name="typeName">
        <xs:choice>
            <xs:element name="elementName" type="someOtherType"><!--This is a comment I would like to access.--></xs:element>
        </xs:choice>
    </xs:complexType>
</xs:schema>

我碰巧在使用 VB.Net。这是试图从上述 XSD 访问 XML 注释的类的 sn-p:

Public Class QAutoTestXSD

    Private XML As MSXML2.DOMDocument60

    Public Sub New()
        XML = New MSXML2.DOMDocument60
        Call XML.setProperty("SelectionNamespaces", "xmlns:xs='http://www.w3.org/2001/XMLSchema'")
        XML.async = False
        If Not XML.load("C:\myXML.xml") Then
            Call handleParsingError
        End If
    End Sub

    Public Function getXSDComment(typeName As String, elementName As String) As String
        getXSDComment = XML.selectSingleNode("/xs:schema/xs:complexType[@name='" & typeName & "TestType']/xs:choice/xs:element[@name='" & elementName & "']/comment()").nodeValue
    End Function

End Class

通过修改 selectSingleNode 的 XPATH 参数,我能够成功访问 XSD 中的所有其他节点类型,但是我还没有成功选择任何注释类型的节点,即使使用“//comment()”也是如此。任何帮助将不胜感激!

【问题讨论】:

  • loadXML 方法采用带有 XML 标记的字符串,而不是文件名。以及为什么将 MSXML 与 .NET 一起使用,System.Xml.XmlDocument 或 System.Xml.Linq.XDocument 是纯托管实现。 //comments() 也应该给出 XPath 错误,节点测试是单数 //comment()
  • @MartinHonnen 我敢肯定你可以看出,所有的代码都只是一个模型。对于您指出的两个错误,我深表歉意,我会更正它们,但是原始代码中不存在这些问题。至于 MSXML,我正在将旧版 VBA 转换为 VB.Net,并希望尽可能多地保留旧代码库以加快转换速度。
  • @TonyHopkinson 我知道这个问题,但是接受的答案与我尝试使用但未成功的方法相同。

标签: xml vb.net dom xpath msxml


【解决方案1】:

考虑发布一个最小但完整的示例,以便我们重现问题。当我使用

Module Module1

    Sub Main()
        Dim doc As MSXML2.DOMDocument60 = New MSXML2.DOMDocument60
        If doc.load("XMLFile1.xml") Then
            doc.setProperty("SelectionNamespaces", "xmlns:xs='http://www.w3.org/2001/XMLSchema'")
            Dim comment As MSXML2.IXMLDOMComment = doc.selectSingleNode("//xs:element//comment()")
            If comment IsNot Nothing Then
                Console.WriteLine(comment.nodeValue)
            End If
        End If
    End Sub

End Module

XMLFile1.xml 在哪里

<?xml version="1.0" encoding="utf-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:complexType name="typeName">
    <xs:choice>
      <xs:element name="elementName" type="someOtherType">
        <!--This is a comment I would like to access.-->
      </xs:element>
    </xs:choice>
  </xs:complexType>
</xs:schema>

然后程序(使用 VS 2012 编译为 .NET 4.5 应用程序)输出“这是我想访问的评论。”。

【讨论】:

  • 谢谢马丁,这很好用。问题最终与我的 VS 资源没有正确更新有关,因此完全与发布的内容无关。我觉得在这一点上我的问题基本上是无关紧要的,我最好直接删除它吗?
  • 是的,你可以删除它。
猜你喜欢
  • 2010-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多