Получение данных из XML с помощью Xquery для текста - PullRequest
2 голосов
/ 18 августа 2011

У меня довольно большой набор больших файлов XML, из каждого из которых я хочу извлечь некоторые данные.Я использую ознакомительную версию Altova XMLSpy, в которой мне удалось заставить работать XPATH.Однако мне нужны данные в CSV или текстовом формате, поэтому я могу использовать их в R или Excel для дальнейшей оценки и не могу скопировать результаты XPATH в файл.Я обнаружил, что с помощью XQUERY я смог бы, но мне не удалось заставить XQUERY работать хотя бы для одного файла.

XML структурирован как:

<d2LogicalModel xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://datex2.eu/schema/2_0/2_0" modelBaseVersion="2.0" xsi:schemaLocation="http://datex2.eu/schema/2_0/2_0 D:\NDW\CSS\DataGenerator\DATEXIISchema_2_0_2_0.xsd">
<payloadPublication xmlns="http://datex2.eu/schema/2_0/2_0" xsi:type="MeasuredDataPublication" lang="nl">
    <publicationTime>2011-04-21T05:58:34Z</publicationTime>
    <publicationCreator>
        <country>nl</country>
        <nationalIdentifier>NDW-CNS</nationalIdentifier>
    </publicationCreator>
    <measurementSiteTableReference>NDW01_MT_321</measurementSiteTableReference>
    <headerInformation>
        <areaOfInterest>national</areaOfInterest>
        <confidentiality>restrictedToAuthorities</confidentiality>
        <informationStatus>real</informationStatus>
    </headerInformation>
    <siteMeasurements>
        <measurementSiteReference>GRT01_MORO_1002_2</measurementSiteReference>
        <measurementTimeDefault>2011-04-21T05:57:00Z</measurementTimeDefault>
        <measuredValue index="1">
            <basicDataValue xsi:type="TrafficSpeed"/>
        </measuredValue>
        <measuredValue index="2">
            <basicDataValue xsi:type="TrafficSpeed"/>
        </measuredValue>
        <measuredValue index="3">
            <basicDataValue xsi:type="TrafficSpeed"/>
        </measuredValue>
        <measuredValue index="4">
            <basicDataValue xsi:type="TrafficSpeed"/>
        </measuredValue>
        <measuredValue index="5">
            <basicDataValue xsi:type="TrafficSpeed"/>
        </measuredValue>
        <measuredValue index="6">
            <basicDataValue xsi:type="TrafficSpeed"/>
        </measuredValue>
    </siteMeasurements>
    <siteMeasurements>
        <measurementSiteReference>RWS01_MONIBAS_0021hrr2131ra</measurementSiteReference>
        <measurementTimeDefault>2011-04-21T05:57:00Z</measurementTimeDefault>
        <measuredValue index="1">
            <basicDataValue xsi:type="TrafficFlow">
                <time>2011-04-21T05:56:00Z</time>
                <vehicleFlow>900</vehicleFlow>
            </basicDataValue>
        </measuredValue>
        <measuredValue index="2">
            <basicDataValue xsi:type="TrafficSpeed">
                <numberOfInputValuesUsed>60</numberOfInputValuesUsed>
                <standardDeviation>0</standardDeviation>
                <time>2011-04-21T05:56:00Z</time>
                <averageVehicleSpeed>115</averageVehicleSpeed>
            </basicDataValue>
        </measuredValue>
        <measuredValue index="3">
            <basicDataValue xsi:type="TrafficFlow">
                <time>2011-04-21T05:56:00Z</time>
                <vehicleFlow>1020</vehicleFlow>
            </basicDataValue>
        </measuredValue>
        <measuredValue index="4">
            <basicDataValue xsi:type="TrafficSpeed">
                <numberOfInputValuesUsed>60</numberOfInputValuesUsed>
                <standardDeviation>0</standardDeviation>
                <time>2011-04-21T05:56:00Z</time>
                <averageVehicleSpeed>104</averageVehicleSpeed>
            </basicDataValue>
        </measuredValue>
    </siteMeasurements>

Я хочу отфильтровать определенное значение для measureSiteReference и получить результаты всех measuredValue с basicDataValue для TrafficFlow, предпочтительно в формате:

index, value, timestamp
1, 900, 05:56:00
3, 1020, 05:56:00

У меня есть следующий XPATH:

//text()[contains(.,"GEO01_Z_RWSTI1011")]/parent::*/parent::*/descendant::measuredValue[(@index)]/basicDataValue/vehicleFlow

Это дает мне результаты для одного файла, но я не могу найти способ преобразовать это XPATH в XQUERY.Текущий XQUERY не возвращает результатов:

let $nl := "&#10;"
for $x in doc("TrafficSpeed 20110421 0800-1559\0800_trafficspeed")/d2LogicalModel/payloadPublication/siteMeasurements
where $x/measurementSiteReference/text()[contains(.,"GEO01_Z_RWSTI1011")]
return concat($x/measurementSiteReference/measuredValue,$nl)

Как я могу получить возврат, который я хочу использовать XQUERY?

Ответы [ 3 ]

0 голосов
/ 18 августа 2011

Ваши элементы связаны с пространством имен xmlns="http://datex2.eu/schema/2_0/2_0", но вы не являетесь пространством имен, которое квалифицирует ваши элементы в ваших операторах XPATH.Итак, ваши операторы XPATH не выбирают нужные элементы.

Вы хотели бы сделать что-то подобное, чтобы объявить пространство имен и использовать его в ваших операторах XPath:

declare namespace datex = "http://datex2.eu/schema/2_0/2_0";

let $nl := "&#10;"

for $x in doc("TrafficSpeed 20110421 0800-1559\0800_trafficspeed")/datex:d2LogicalModel/datex:payloadPublication/datex:siteMeasurements
where $x/datex:measurementSiteReference/text()[contains(.,"GEO01_Z_RWSTI1011")]
return concat($x/datex:measurementSiteReference/datex:measuredValue,$nl)

Тем не менее, вы, вероятно, столкнетесь с проблемой, используя concat() в последовательности, и что текущий код не даст желаемого результата.

0 голосов
/ 19 августа 2011

Мне удалось получить ответ, хотя и не полный, как хотелось бы:

declare namespace datex = "http://datex2.eu/schema/2_0/2_0";
declare variable  $sep := ',';
declare variable  $eol := '&#10;';

for $x in collection("0900_trafficspeed")/datex:d2LogicalModel/datex:payloadPublication/datex:siteMeasurements
let $site := $x/datex:measurementSiteReference/text()
let $time := $x/datex:measurementTimeDefault/text()
let $index := $x/datex:measurementSiteReference/parent::*/descendant::datex:measuredValue/@index
let $flow := $x/datex:measurementSiteReference/parent::*/descendant::datex:measuredValue/datex:basicDataValue/datex:vehicleFlow/text()
where $x/datex:measurementSiteReference/text()[contains(.,"GEO01_Z_RWSTI1011")]
return string(concat(string-join(($site,$time,$flow),$sep),$eol))
0 голосов
/ 18 августа 2011

Попробуйте - http://www.stylusstudio.com/xquery_primer.html или http://xmlbeans.apache.org/docs/2.0.0/guide/conSelectingXMLwithXQueryPathXPath.html

Кроме того, есть отличные примеры от Oracle, IBM и Microsoft - если вам действительно нужна расширенная помощь.

...