2014-12-14 5 views
0

Некоторые файлы мне нужно обработать уже это (так называемый «имущими»):Некоторые файлы имеют «XMLNS», другие - «XSI». Как установить псевдоним для запроса xpath, который будет работать с ним?

<ApolloDataSet xmlns="http://irisoft.com/ApolloDataSet1.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 

Другие файлы в той же группе есть это (так называемые «неимущим»):

<ApolloDataSet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 

Я могу установить пространство имен по умолчанию для XPath с ниже:

.setProperty "SelectionNamespaces", "xmlns:a='http://irisoft.com/ApolloDataSet1.xsd'" 

Это работает для имущих, как:/элемент, но не неимущим, так как XPath не имеет а: псевдоним.

Я попытался удалить атрибут xmlns перед обработкой, в надежде, что я могу просто использовать unaliased путь для обоих, например/Element, но это только работало для has-nots (у них ничего не возвращалось).

Так есть способ обрабатывать оба с использованием одного и того же псевдонима или без псевдонима? Я пытаюсь либо использовать один и тот же псевдоним для каждого файла, независимо от того, включен ли «xmlns», либо не использовать псевдоним для обоих.

ответ

0

Ну, я смирился с использованием обходного пути, которого я пытался избежать. Но вот вариант для этой ситуации, пока я не найду лучшего. (И забыл упомянуть - с помощью VBA для этого.)

После загрузки domDocument я использую метод getAttribute, чтобы проверить, имеет ли значение атрибута «xmlns» значение null. Если это, я формирую строку xpath без псевдонима с помощью vbnullstring, что означает, что запрос xpath работает с файлами has-not (т. Е. Те файлы без «xmlns»). Если это не null, я использую значение «xmlns» для построения строки для метода setProperty, устанавливающего вторичное свойство «SelectionNamespaces».

If IsNull(xPOG.DocumentElement.getAttribute("xmlns")) Then 
    strAlias = vbNullString 
Else 
    strAlias = "a:" 
    xPOG.setProperty "SelectionNamespaces", _ 
    "xmlns:" & Mid(strAlias, 1, 1) & "='" & xPOG.DocumentElement.getAttribute("xmlns") & "'" 
End If 

И получившаяся обработка приобретает довольно уродливую форму строения, которую я надеялся избежать. Он устанавливает IXMLDOMNode для узлов, возвращаемых методом selectnodes, используя запрос xPath с переменной strAlias.

Set xProducts = xPOG.SelectNodes("/" & strAlias & "ApolloDataSet/" _ 
           & strAlias & "Products/" _ 
           & strAlias & "Product/" _ 
           & strAlias & "PR_UPC") 

Это не то, что это плохо, это только кажется, что не хватает элегантности & напомнить мне о том, как мало я знаю, иногда. Это заставляет меня поверить, что мне не хватает понятия, которое могло бы исправить это. Но он работает, поэтому я буду следить, если найду лучше. Я нашел статью kb, которая затрагивала некоторые концепции, если она помогает кому-либо. Я использую 6.0, хотя, так хорошее концептуальное объяснение, просто не совсем то, что мне нужно.

PRB: MSXML 4.0 Sets the XML Namespace Attribute to an Empty Value for Child Nodes