2011-12-01 33 views
0

下面我有,我已经贴here与此规则的XML:关于在XML的XPath

/书店/书/价格/文()

<?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() 

我期待的网站言论“*”,但事实并非如此。为什么?

哈维

+0

''和''标签上的命名空间可能会丢掉东西。 –

+0

@MarcB,它们不是所述元素的命名空间,它们是属性的命名空间。 –

+0

糟糕,那只是关于“过滤器”。是的,这也可能增加这个问题。 –

回答

1

Value不是Field孩子(你有Field/Value那里)。

+0

是的,这是真的,但它无法正常工作..这是我的新xpath:/ SearchResponse/GlobalFilter/Filters/Filters/Value/Treevalue/Value/text() – ziiweb

+0

首先,你没有告诉什么是不是现在工作。其次,请阅读Marc的评论,您需要在xml中声明名称空间,并在xpath表达式前缀中为每个元素名称添加前缀。 –

+0

喜欢'xmlns:j =“http://www.liberologico.com/dbsite/jolly-search”'和'/ j:SearchResponse/j:GlobalFilter ...' –

2

这是因为涉及到XML默认名称空间(请参阅xmlns="http://www.liberologico.com/dbsite/jolly-search"声明)。

/SearchResponse这样的XPath表达式不会匹配任何内容,因为实际上没有该名称的元素(元素的名称空间总是会计入其名称中)。

除非您告诉服务器专门查看此名称空间中的元素,否则它将永远找不到它们。

您可以解决此通过指定你正在寻找元素的任何命名空间(该local-name()函数提取纯元素名称):

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

或告诉服务器命名空间参与,给它一个前缀(比如,js),并发出一个XPath搜索完全合格的名称:

//js:Treevalue/*/text() 

第一种方法是容易的,因为没有代码更换的R在服务器端确定。然后,它又需要冗长和难看的XPath表达式。第二种方法需要在服务器上实现名称空间支持,但XPath表达式会很好,很干净。

第三种方法是在将XML发送到服务器之前从XML中除去名称空间声明,但是 - 根据您的情况 - 这可能不可行。