【问题标题】:Getting data out of XML by Xquery to text通过 Xquery 从 XML 中获取数据到文本
【发布时间】:2011-08-17 20:05:05
【问题描述】:

我有一组相当大的 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>

我想过滤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 获得我想要的回报?

【问题讨论】:

    标签: xml xpath xquery


    【解决方案1】:

    试试 - http://www.stylusstudio.com/xquery_primer.html 或者 http://xmlbeans.apache.org/docs/2.0.0/guide/conSelectingXMLwithXQueryPathXPath.html

    此外,如果您真的需要高级帮助,还有来自 Oracle、IBM 和 Microsoft 的优秀示例。

    【讨论】:

      【解决方案2】:

      您的元素绑定到命名空间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() 时遇到问题,并且当前代码不会产生您想要的输出。

      【讨论】:

      • 谢谢!命名空间提示确实有帮助,因为我现在得到了结果(当失去 concat() 时)。我仍然需要将结果分开。
      【解决方案3】:

      我设法得到了答案,虽然没有像我想要的那样完整:

      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))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-06
        • 1970-01-01
        • 1970-01-01
        • 2011-07-14
        • 2014-01-28
        • 1970-01-01
        相关资源
        最近更新 更多