gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:26:15 25 4
gpt4 key购买 nike

我正在尝试使用 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>...

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

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

溴,

安德烈亚斯

最佳答案

I want to use the following xpath expression:


/Msg[count('OrderStatus')[ 0]

but this won't work since I get an error message saying: "Namespace Manager or XsltContext needed.



这是一个常见问题。

在 XPath 中,无前缀的名称总是被认为属于“无命名空间”。

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

您有两种可能的方式来编写 XPath 表达式 :
  • 使用宿主语言的功能将前缀与表达式中的名称所属的所有不同命名空间相关联。在这个具体案例中,您没有说明托管语言是什么,所以我无法帮助您。可以找到 C# 示例 here .

  • 如果您已关联前缀 "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']]
    最后,请注意 :
  • 为了测试一个元素 x有 child y没有必要测试阳性 count(y) . 只需使用 :x[y]
  • Xpath 位置从 1 开始 .这意味着 NodeSetExpression[0]从不选择节点。您要:NodeSetExpression[1]
  • 关于xpath - 使用命名空间运行 xpath 查询时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3804055/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com