2011-08-17 3 views
2

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

Я хочу, чтобы фильтровать по конкретному значению для measurementSiteReference и получить результаты всех 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?

ответ

0

Ваши элементы привязаны к пространству имен 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

Спасибо! Указание пространства имен помогло, так как теперь я получаю результаты (при потере concat()). Мне все же нужно отделить результаты. – ThijsMuis

0

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

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)) 
Смежные вопросы