2015-04-16 6 views
1

В нашем случае мы имеем динамический XML тег что-то вроде этогоXPath имена подстановочных лучшая практика

<ab:SomeProcessResponse xmlns:ab="http://something.com/xyz" 
         xmlns:cd="http://something.com/lmno"> 

Или иногда я мог бы получить ответ как

<def:SomeProcessResponse xmlns:def="http://something.com/xyz" 
         xmlns:cd="http://something.com/lmno"> 

Что лучше практики я должен следовать при выборе узла SomeProcessResponse в таких случаях?

ответ

2

Здесь нет необходимости использовать «подстановочный знак», поскольку оба примера представляют собой один и тот же XML - элемент с локальным именем SomeProcessResponse и пространство имен URI http://something.com/xyz. Тот факт, что они используют два разных префикса, не имеет значения, привязки префикса, используемые в выражении XPath, соответствуют библиотеке XPath и не должны соответствовать тем, которые используются в документе.

Вы должны использовать возможности вашей библиотеки XPath предоставляет связать префикс, например, как xyz к http://something.com/xyz URI пространства имен, затем XPath из xyz:SomeProcessResponse будет соответствовать обоим примеры.

Чтобы дать более конкретный ответ, мне нужно знать, какой язык программирования и какой XPath API вы используете.


Edit: в вашем комментарии вы говорите, что вы используете JavaScript - в этом случае вы можете поставить пространство имен привязок, передавая функцию document.evaluate

var result = document.evaluate("//xyz:SomeProcessResponse", document, function(prefix) { 
    if(prefix == "xyz") { 
    return "http://something.com/xyz"; 
    } else { 
    return null; 
    } 
}, XPathResult.UNORDERED_NODE_ITERATOR_TYPE, null); 
+0

Мы используем javascript –

0

Если вы объявляете пространство имен, либо ответ будут правильно определены.

Если то, что вам нужно, это xpath, чтобы найти элементы, независимо от пространства имен, вы можете использовать это:

//*[local-name()='SomeProcessResponse'] 

Но имейте в виду, что это будет справедливо для всех следующих случаях:

<ab:SomeProcessResponse xmlns:ab="http://something.com/xyz" xmlns:cd="http://something.com/lmno"> 
<def:SomeProcessResponse xmlns:def="http://something.com/xyz" xmlns:cd="http://something.com/lmno"> 
<ab:SomeProcessResponse xmlns:ab="http://somethingCompletelyDifferent.com/xyz"> 
<SomeProcessResponse> 
+0

С уважением, parakmiakos! –

4

Лучшая практика для выбора XML-элемента с пространством имен заключается в том, чтобы указать пространство имен, , а не, чтобы игнорировать его с помощью какого-либо механизма «подстановочных знаков».

Для совместимых процессоров XPath, всегда есть механизм, позволяющий связывание префикса пространства имен (например: ab) в пространстве имен URI (например: http://something.com/xyz). Также не обязательно использовать один и тот же префикс пространства имен (ab), который используется в исходном XML; требуется только URI пространства имен (http://something.com/xyz). Единственная проблема, однако, в том, что XPath сам не имеет механизма привязки префиксов пространства имен к URI пространства имен. Как это сделать, зависит от возможностей, предлагаемых библиотекой (например: libxml2, javax.xml.xpath и т. Д.) Или языка хостинга (например, XSLT).

Чтобы обеспечить чистый ответ XPath или иногда из-за (обычно нерационального) отвращения к пространствам имен, вы иногда увидите используемый шаблон. Общим шаблоном является использование local-name(), чтобы ссылаться только на локальное имя (например: SomeProcessResponse) независимо от пространства имен.Проблема заключается в том, что он не только обходит префикс пространства имен (например: ab), но и обходит URI пространства имен (http://something.com/xyz), а URI пространства имен является неотъемлемой частью имени и важной частью связывания других объектов с элементом , К таким другим объектам относятся, например, валидация и сопоставления классов OO.

Так что, да, есть шаблонные механизмы уворачиваясь пространствами имен, но лучшая практика заключается в использовании средства на хостинге языке/библиотеке связать префиксы пространства имен с пространствами имен URI,, не, чтобы избежать имен через групповые символы.

+0

Спасибо, Кеннет! –

Смежные вопросы