Xquery不“过滤”具有属性的第一个TAG

时间:2019-01-16 16:15:24

标签: xml xpath xquery

我是xquery菜鸟,正在“测试”代码

对我来说,在具体内容中过滤一个xml是不可能的。 我不确定,但是第一个TAG似乎有问题,它包含一个属性,而且可能是我解析错误...

XML示例

<findToFileResponse xmlns="xmlapi_1.0">
        <equipment.PhysicalPort>
                <mtuValue>9728</mtuValue>
                <userLabel>RIOXXXX</userLabel>
        <displayedName>Port 1/1</displayedName>
        <siteId>10.10.10.1</siteId>
        <siteName>LO0015P1</siteName>
        <children-Set>
            <ethernetequipment.EthernetPortSpecifics>
                <actualDuplex>fd1000</actualDuplex>
                <children-Set></children-Set>
            </ethernetequipment.EthernetPortSpecifics>
        </children-Set>
    </equipment.PhysicalPort>
    <equipment.PhysicalPort>
        <mtuValue>9728</mtuValue>
        <userLabel>RIOXXXX</userLabel>
        <displayedName>Port 1/2</displayedName>
        <siteId>10.10.10.10</siteId>
        <siteName>LO0015P1</siteName>
        <children-Set>
            <ethernetequipment.EthernetPortSpecifics>
                <actualDuplex>fd1000</actualDuplex>
                <children-Set></children-Set>
            </ethernetequipment.EthernetPortSpecifics>
        </children-Set>
    </equipment.PhysicalPort>
</findToFileResponse>

例如,此xquery(Im测试中,对象与具有相同第一个TAG的其他xml联接):

let $docu1 := doc("ListadoVanos.Mon_Jan_14_040000_CET_2019.xml")/findToFileResponse
return $docu1

我期望类似:

<equipment.PhysicalPort>
        <mtuValue>9728</mtuValue>
        <userLabel>RIOXXXX</userLabel>
        <displayedName>Port 1/1</displayedName>
        <siteId>10.10.10.1</siteId>
        <siteName>LO0015P1</siteName>
        <children-Set>
            <ethernetequipment.EthernetPortSpecifics>
                <actualDuplex>fd1000</actualDuplex>
                <children-Set></children-Set>
            </ethernetequipment.EthernetPortSpecifics>
        </children-Set>
</equipment.PhysicalPort>
<equipment.PhysicalPort>
...
</equipment.PhysicalPort>
<equipment.PhysicalPort>
...
</equipment.PhysicalPort>

...

但要回答一个空结果

有什么主意吗?你能帮我建立第一个过滤器吗?

预先感谢

我使用BaseX。这是该信息:

Compiling:
- pre-evaluate fn:doc(uri) to document-node() item: doc("ListadoVanos.Mon_Jan_14_040000_CET_... -> document-node {"ListadoVanos.Mon_Jan_14_...
- remove unknown element/attribute findToFileResponse
- pre-evaluate iter path to empty sequence: document-node {"ListadoVanos.Mon_Jan_14_... -> ()
- inline $docu1_0
- simplify FLWOR expression: ()
Optimized Query:
()
Query:
let $docu1 := doc("ListadoVanos.Mon_Jan_14_040000_CET_2019.xml")/findToFileResponse return $docu1
Result:
- Hit(s): 0 Items
- Updated: 0 Items
- Printed: 0 b
- Read Locking: ListadoVanos.Mon_Jan_14_040000_CET_2019.xml
- Write Locking: (none)
Timing:
- Parsing: 0.26 ms
- Compiling: 123.72 ms
- Evaluating: 0.17 ms
- Printing: 0.01 ms
- Total Time: 124.17 ms
Query plan:
<QueryPlan compiled="true" updating="false">
  <Empty size="0" type="empty-sequence()"/>
</QueryPlan>

1 个答案:

答案 0 :(得分:2)

您遇到了一个常见问题:选择名称空间中的XML。选择/findToFileResponse时,正在选择名为findToFileResponse的元素,但是由于未指定名称空间前缀,因此假定您要选择不带名称空间的元素,这很常见。

但是,您可以看到XML文档在名称空间中,因为它使用了default namespace attribute,这导致其自身及其所有后代都包含在该名称空间中(除非另有说明):

xmlns="xmlapi_1.0"

要在此命名空间中选择一个元素,首先需要在XQuery prolog中declare it and assign it to a prefix

declare namespace api = "xmlapi_1.0";

现在您可以使用前缀选择该名称空间中的元素:

/api:findToFileResponse

您还可以使用通配符前缀选择任何名称空间中的元素:

/*:findToFileResponse