tirenweb
tirenweb

Reputation: 31739

About an xpath in a xml

I have the xml below that I've pasted here with this rule:

/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> 

When I submit the form, the prices are remarked.

Now I'm trying to do the same with this 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>

and this rule:

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

I expected the site remarks the "*" but it doesn't.. why?

Javi

Upvotes: 0

Views: 87

Answers (2)

Tomalak
Tomalak

Reputation: 338386

That's because there is an XML default namespace involved (see the xmlns="http://www.liberologico.com/dbsite/jolly-search" declaration).

An XPath expression like /SearchResponse will match nothing since there actually is no element of that name (an element's namespace always counts into its name).

Unless you tell the server to look at elements specifically in this namespace, it will never find them.

You can work around this by either specifying that you're looking for elements in any namespace (the local-name() function extracts the plain element name):

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

or by telling the server that a namespace is involved, giving it a prefix (say, js) and issuing an XPath search for fully qualified names:

//js:Treevalue/*/text()

The first method is easy since there is no code change required on the server side. Then again it requires long-winded and ugly XPath expressions. The second method requires implementing namespace support on the server but XPath expressions will be nice and clean.

The third method would be to remove the namespace declaration from the XML before you send it to the server, but – depending on your situation – that might not be feasible.

Upvotes: 2

Michael Krelin - hacker
Michael Krelin - hacker

Reputation: 143269

Value is not a child of Field (You have Field/Value there).

Upvotes: 1

Related Questions