Про xpath в xml - PullRequest
       11

Про xpath в xml

0 голосов
/ 01 декабря 2011

У меня есть ниже XML, который я вставил здесь с этим правилом:

/ bookstore / book / price / text ()

<?xml version="1.0" encoding="ISO-8859-1"?>

<bookstore>

<book category="COOKING">
  <title lang="en">Everyday Italian</title>
  <author>Giada De Laurentiis</author>
  <year>2005</year>
  <price>30.00</price>
</book>

<book category="CHILDREN">
  <title lang="en">Harry Potter</title>
  <author>J K. Rowling</author>
  <year>2005</year>
  <price>29.99</price>
</book>

<book category="WEB">
  <title lang="en">XQuery Kick Start</title>
  <author>James McGovern</author>
  <author>Per Bothner</author>
  <author>Kurt Cagle</author>
  <author>James Linn</author>
  <author>Vaidyanathan Nagarajan</author>
  <year>2003</year>
  <price>49.99</price>
</book>

<book category="WEB">
  <title lang="en">Learning XML</title>
  <author>Erik T. Ray</author>
  <year>2003</year>
  <price>39.95</price>
</book>
</bookstore> 

Когда я отправляю форму, цены отмечаются.

Теперь я пытаюсь сделать то же самое с этим xml:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
  <SearchResponse xmlns="http://www.liberologico.com/dbsite/jolly-search">
    <GlobalFilter>
      <Filters>
        <Filters xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="FilterSpecType">
          <Field>aptve_territorio</Field>
          <Value>
            <TreeValue>
              <Value>*</Value>
            </TreeValue>
          </Value>
        </Filters>
        <Filters xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="FilterSpecType">
          <Field>full_text_search</Field>
          <Value>
            <SingleValue>*</SingleValue>
          </Value>
        </Filters>
        <Filters xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="FilterSpecType">
          <Field>lang</Field>
          <Value>
            <SingleValue>it</SingleValue>
          </Value>
        </Filters>
      </Filters>
    </GlobalFilter>
 </SearchResponse>

и этим правилом:

/SearchResponse/GlobalFilter/Filters/Filters/Field/Value/Treevalue/Value/text() 

Я ожидал, что сайт пометит "*", но это не так .. почему?

Javi

Ответы [ 2 ]

2 голосов
/ 01 декабря 2011

Это потому, что используется пространство имен XML по умолчанию (см. Объявление xmlns="http://www.liberologico.com/dbsite/jolly-search").

Выражение XPath наподобие /SearchResponse не будет ничего совпадать, так как на самом деле нет элемента с таким именем (пространство имен элемента всегда учитывается в его имени).

Если вы не скажете серверу рассматривать элементы конкретно в этом пространстве имен, он никогда их не найдет.

Вы можете обойти это, указав, что вы ищете элементы в любом пространстве имен (функция local-name() извлекает простое имя элемента):

//*[local-name() = 'Treevalue']/*/text()

или сообщив серверу, что пространство имен задействовано, присвоив ему префикс (скажем, js) и выполнив поиск в XPath для полностью определенных имен:

//js:Treevalue/*/text()

Первый способ прост, поскольку на стороне сервера не требуется никаких изменений кода. С другой стороны, для этого нужны длинные и уродливые выражения XPath. Второй метод требует реализации поддержки пространства имен на сервере, но выражения XPath будут хорошими и чистыми.

Третий метод заключается в удалении объявления пространства имен из XML перед его отправкой на сервер, но - в зависимости от ситуации - это может оказаться невозможным.

1 голос
/ 01 декабря 2011

Value не является ребенком Field (у вас там Field/Value).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...