sql-server - 替代祖先或自身(或选择树中具有特定子节点的所有节点)

标签 sql-server xml xpath asp-classic xmldom

我试图识别树中通向特定节点的所有节点。

我正在尝试通过MSSQL XML(2005)或ASP classic中的Microsoft.XMLDOM来实现此目的。

我知道XPATH的逻辑,但是SQL Server不支持ancestor-or-self轴,并且XMLDOM似乎在::表示法上令人窒息。

当我在XPATH测试仪中对其进行测试时,可以使用的xpath是

//static[@id=6]/ancestor-or-self::static


我的XML(在sql服务器中递归生成)看起来像

<root>
  <static id="1" title="some title 1" />
  <static id="2" title="some title 2">
     <children>
        <static id="3" title="some title 3" />
        <static id="4" title="some title 4">
          <children>
            <static id="5" title="some title 5" />
            <static id="6" title="some title 6" />
          </children>
        </static>
     </children>
  </static>
  <static id="7" title="some title 7" />
</root>


XPATH应该以任何顺序选择ID为(2,4,6)的节点,因此我可以向所有节点添加属性。

这是用于菜单系统的,其中我只知道所选的叶子,并且需要将所有通向该叶子的节点标记为已隐藏。

如果能克服XMLDOM的阻塞,我将不胜感激
(运行xml.documentElement.selectNodes("//static[@id=6]/ancestor-or-self::static")会产生以下错误:Expected token 'eof' found ':'. //static[@id=6]/ancestor-or-self-->:<--:static

或寻找替代解决方案。也许可以在任何深度找到包含特定节点(id = 6)的所有节点。

最佳答案

使用IIS6在W2K3上运行,我测试了MSXML2.XMLDomDocument.4.0版本。

Dim XMLDom ''# As MSXML2.DOMDocument40

Set XMLDom = CreateObject("MSXML2.DOMDocument.4.0")
Call XMLDom.setProperty("SelectionLanguage", "XPath")

Call XMLDom.loadXML( {document as described above - mistakes in original xml doc)
)


Dim originalQuery ''# As String
originalQuery = "//static[@id=6]/ancestor-or-self::static"

Dim replacementQuery ''# As String
replacementQuery = "//static[descendant::static[@id=6] or @id=6]"


Dim XmlElemList ''# As MSXML2.IXMLDOMNodeList
Set XmlElemList = XMLDom.documentElement.selectNodes(originalQuery)

Dim XmlElemList2 ''# As MSXML2.IXMLDOMNodeList
Set XmlElemList2 = XMLDom.documentElement.selectNodes(replacementQuery)

Dim XmlElem ''# As MSXML2.IXMLDOMElement
Call Response.Write("Using original query : '" & originalQuery & "' (" & XmlElemList.Length & ")<br>")
For Each XmlElem In XmlElemList
    Call Response.Write("XmlEntry : " & XmlElem.getAttribute("id") & "<br>")
    Call Response.Write("****<br>")
Next

Call Response.Write("Using replacement query : '" & replacementQuery & "' (" & XmlElemList2.Length & ")<br>")
For Each XmlElem In XmlElemList2
    Call Response.Write("XmlEntry : " & XmlElem.getAttribute("id") & "<br>")
    Call Response.Write("****<br>")
Next

关于sql-server - 替代祖先或自身(或选择树中具有特定子节点的所有节点),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2345164/

相关文章:

javascript - 将鼠标悬停在其父 div 上时,如何更改链接为对象的 SVG 的属性?

java - Magento Java Soap 无效的 XML 响应

XML - 命名空间

xml - 按值选择文本节点

mysql - SQL 从逗号分隔的字符串中选择查询

c# - SQL 服务器 : randomize rows (shuffle IDs)

c# - 当ID为GUID时如何从数据库获取最新行

.net - 令人惊讶的性能差异 : List. Contains、SortedList.ContainsKey、DataRowCollection.Contains、Data Table.Select、DataTable.FindBy

python - XPath 返回空列表。为什么它忽略目标 div 元素?

javascript - Puppeteer 中的 XPath 表达式而不是 CSS 选择器?