альтернатива предку или себе (или выбрать все узлы в дереве с определенным дочерним узлом)

Я пытаюсь определить все узлы в дереве, ведущие к определенному узлу.

Я пытаюсь выполнить это либо с помощью MSSQL XML (2005), либо с помощью Microsoft.XMLDOM в классическом ASP.

Я знаю логику с 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 должен выбирать узлы с идентификатором (2,4,6) в любом порядке, поэтому я могу добавить атрибут ко всем из них..

Это для системы меню, где я знаю только выбранный лист, и мне нужно пометить как hilit все узлы, ведущие к нему.

Я был бы признателен за любую помощь в преодолении удушья XMLDOM (запуск xml.documentElement.selectNodes("//static[@id=6]/ancestor-or-self::static") приводит к следующей ошибке: Expected token 'eof' found ':'. //static[@id=6]/ancestor-or-self-->:<--:static)

или с поиском альтернативного решения. Возможно, найти все узлы, которые содержат определенный узел (с id = 6) на любой глубине.


person Gabriele Petrioli    schedule 26.02.2010    source источник
comment
альтернативное решение с точки зрения чего? новый парсер, другой xpath или другой язык программирования?   -  person vtd-xml-author    schedule 27.02.2010
comment
@ Джимми, любая альтернатива, кроме смены технологий, поскольку проект уже находится в стадии разработки.   -  person Gabriele Petrioli    schedule 27.02.2010
comment
Какую версию XMLDocument вы используете в классической части реализации ASP?   -  person Marvin Smit    schedule 27.02.2010
comment
Ваш XML сформирован неправильно, «статические» элементы с идентификаторами 4 и 7 не закрыты.   -  person Marvin Smit    schedule 27.02.2010
comment
@Marvin, игра с версией XMLDom помогла .. спасибо, что подняли ее.   -  person Gabriele Petrioli    schedule 27.02.2010


Ответы (2)


Работая на W2K3, используя IIS6, я протестировал версию 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
person Marvin Smit    schedule 27.02.2010
comment
Да, похоже, проблема в этом.. Замена на версию 4 или 5 помогла... Большое спасибо :) Я использовал Microsoft.XMLDOM, который загрузил версию 2 :o - person Gabriele Petrioli; 27.02.2010

Это своего рода ответы «привести в порядок концы».

Во-первых, ваша основная проблема заключается в том, что «Microsoft.XMLDOM» обычно загружает реализацию версии 3.0 (MSXML3.dll). MSXML3 поддерживает полный язык XPATH 1.0, но не по умолчанию. Следующие должны быть достаточными для исправления: –

dom.SetProperty "SelectionLanguage", "XPath"

Ответ Марвина включает эту строку при использовании MSXML4, но на самом деле это не обязательно, поскольку XPath является языком выбора по умолчанию для версии 4 и выше.

Однако я намеренно использую слово следует выше. Я часто сталкивался с серверами, которые были скомпрометированы сторонним приложением, которое также включает в себя дистрибутив MSXML2, но устанавливает его неправильно. Они приводят к тому, что "Microsoft.XMLDOM" и независящий от версии "MSXML2.DOMDocument" возвращают реализацию MSXML2.dll вместо реализации MSXML3.

Поэтому я обычно рекомендую, чтобы лучшим ProgID был "MSXML2.DOMDocument.3.0", поскольку вы точно знаете, что получаете. Кроме того, MSXML3.dll гарантированно устанавливается на все поддерживаемые в настоящее время ОС Windows из коробки. Кроме того, MSXML3 оставался совместимым с ошибками в реализации MSXML2, когда документ DOM вызывается с использованием более старого progID. Использование ProgID для конкретной версии приводит к тому, что MSXML3 более строго соответствует стандартам XML.

person AnthonyWJones    schedule 27.02.2010
comment
+1, отличная информация, Энтони, спасибо за продолжение .. (должно ли это быть включено и не скомпрометировано?) - person Gabriele Petrioli; 28.02.2010
comment
По умолчанию это зло! Кажется, они меняются со временем. Думаю, нет никаких сомнений, какой язык выбора он использует при достижении XML 10.0;) - person Marvin Smit; 28.02.2010
comment
@Marvin: Значения по умолчанию великолепны, они, конечно, не злые, без значений по умолчанию наш код было бы намного сложнее написать. Например, приправлены ли ваши XPath в вашем повседневном коде child::, чтобы не полагаться на тот факт, что child:: является осью по умолчанию, используемой XPath? Я публикую эти четкие ответы, чтобы убедиться, что нет неправильных представлений о том, что на самом деле происходит. Из вашего кода можно сделать вывод, что указание XPath необходимо, но это не так. Однако я соглашусь, что в любом случае есть определенное утешение, которое исходит от того, чтобы открыто говорить об этом. - person AnthonyWJones; 28.02.2010
comment
@Gaby: Нет, я имел в виду скомпрометирован. Я видел, как работающие приложения ASP терпели неудачу, когда системный администратор устанавливал какое-то другое стороннее программное обеспечение, которое не должно было оказывать никакого влияния на приложение ASP. Он был скомпрометирован из-за неправильной установки MSXML2. - person AnthonyWJones; 28.02.2010
comment
Хотел бы я проголосовать за этот ответ более одного раза. Отличный ответ и вперед - person Pete Duncanson; 31.08.2011