首页 > 解决方案 > 基于元素部分匹配拉节点的xpath

问题描述

在下面的 xml 片段中,我想为不同的批次提取行节点,这本质上是一个时间戳,即JP1800代表日本 18 点钟时间。

//*[Batch='LN12000']拉出所有伦敦中午节点,同时 data/row拉出所有节点,包括空Batch值。

//*[Batch='LN'*]如果不起作用,我将如何拉所有伦敦时间 ?

<?xml version="1.0"?>
-<data>
+<header>
+<row>
+<row>
+<row>
-<row>
    <Date>2019-10-21</Date>
    <Series>23</Series>
    <OnTheRun>N</OnTheRun>
    <Depth>0</Depth>
    <Batch>JP1700</Batch>
 </row>
-<row>
    <Date>2019-10-21</Date>
    <Series>23</Series>
    <OnTheRun>N</OnTheRun>
    <Depth>4</Depth>
    <Batch>JP1800</Batch>
</row>

标签: xpath

解决方案


听起来您正在寻找类似starts-with功能的东西。:

//header/row/Batch[starts-with(.,"LN")]

这里我们有一些 PHP 代码示例,请看:

    <?php
    $xml = <<<XML
    <?xml version="1.0"?>
    <data>
        <header>
            <row>
                <Date>2019-10-21</Date>
                <Series>23</Series>
                <OnTheRun>N</OnTheRun>
                <Depth>0</Depth>
                <Batch>JP1700</Batch>
            </row>
            <row>
                <Date>2019-02-05</Date>
                <Series>27</Series>
                <OnTheRun>X</OnTheRun>
                <Depth>89</Depth>
                <Batch>LN9877</Batch>
            </row>
        </header>
    </data>
    XML;
    
    $dom = new DOMDocument();
    $dom->loadXML($xml);
    $xpath = new DOMXPath($dom);
    $query = $xpath->query('//header/row/Batch[starts-with(.,"LN")]');
    
    /** @var DOMElement $node */
    foreach ($query as $node) {
        print($node->nodeValue); //outputs LN9877
    }

https://www.w3.org/TR/1999/REC-xpath-19991116/#function-starts-with


推荐阅读