Xquery не «фильтрует» первый тег с атрибутом - PullRequest
0 голосов
/ 16 января 2019

Я noob с 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 (я тестирую, целью является соединение с другим xml с тем же первым TAG):

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 голосов
/ 16 января 2019

Вы столкнулись с общей проблемой: выбор XML, который находится в пространстве имен.Когда вы выбираете /findToFileResponse, вы выбираете элемент с именем findToFileResponse, но поскольку префикс пространства имен не указан, предполагается, что вы хотите выбирать элементы без пространства имен, что является общим.

Однако,вы можете видеть, что ваш XML-документ находится в пространстве имен, потому что он использует атрибут пространства имен по умолчанию , что приводит к тому, что он сам и все его потомки включены в это пространство имен (если не указано иное):

xmlns="xmlapi_1.0"

Чтобы выбрать элемент в этом пространстве имен, вам сначала нужно объявить его и присвоить ему префикс в прологе XQuery:

declare namespace api = "xmlapi_1.0";

Теперь вы можете выбирать элементы вэто пространство имен, используя префикс:

/api:findToFileResponse

Вы также можете выбрать элементы в любом пространстве имен, используя префикс подстановочного знака:

/*:findToFileResponse
...