使用命名空间运行xpath查询时出现问题

And*_*son 7 xpath

我正在尝试使用xpath表达式来选择xml文档中的节点集,并定义了不同的名称空间.

xml看起来像这样:

<?POSTEN SND="SE00317644000" REC="5566420989" MSGTYPE="EPIX"?>
<ns:Msg xmlns:ns="http://www.noventus.se/epix1/genericheader.xsd">
  <GenericHeader>
    <SubsysId>1</SubsysId>
    <SubsysType>30003</SubsysType>
    <SendDateTime>2009-08-13T14:28:15</SendDateTime>
  </GenericHeader>
  <m:OrderStatus xmlns:m="http://www.noventus.se/epix1/orderstatus.xsd">
    <Header>
      <OrderSystemId>Soda SE</OrderSystemId>
      <OrderNo>20090811</OrderNo>
      <Status>0</Status>
    </Header>
    <Lines>...
Run Code Online (Sandbox Code Playgroud)

我只想选择"Msg" - 具有"OrderStatus"子节点的节点,因此我想使用以下xpath表达式:/ Msg [count('OrderStatus')> 0]但这不起作用,因为我得到一个错误消息说:"需要命名空间管理器或XsltContext.此查询具有前缀,变量或用户定义的函数".

所以我想我想使用一个看起来像这样的表达式:/*[local-name()='Msg'] [count('OrderStatus')> 0]但这似乎不起作用..任何想法?

BR,

安德烈亚斯

Dim*_*hev 10

我想使用以下xpath表达式:

/Msg[count('OrderStatus')[ 0]
Run Code Online (Sandbox Code Playgroud)

但这不起作用,因为我收到一条错误消息:"需要命名空间管理器或XsltContext.

这是一个FAQ.

在XPath中,一个未加前缀的名称始终被认为属于"无名称空间".

但是,您要选择的元素实际上位于"http://www.noventus.se/epix1/genericheader.xsd" 命名空间中.

您有两种可能的方法来编写XPath表达式:

  1. 使用托管语言的功能将前缀与表达式中名称所属的所有不同名称空间相关联.你还没有说明这个具体案例中的托管语言是什么,所以我无法帮你解决这个问题.AC#示例可以在这里找到.

如果您有相关的前缀"xxx"命名空间"http://www.noventus.se/epix1/genericheader.xsd"和前缀"yyy"的命名空间"http://www.noventus.se/epix1/orderstatus.xsd",那么你的表达式可以写成:

/xxx:Msg[yyy:OrderStatus]

:2:如果您根本不想使用任何前缀,仍然可以构造XPath表达式,但它不会太可读:

/*[local-name() = 'Msg' and *[local-name() = 'OrderStatus']]

最后,请注意:

  1. 为了测试一个元素x是否有一个孩子y,没有必要测试一个积极的count(y).只需使用:x[y]

  2. Xpath位置是从1开始的.这意味着NodeSetExpression[0]从不选择节点.你要:NodeSetExpression[1]