【问题标题】:Output of Xpath QueryXpath 查询的输出
【发布时间】:2014-04-19 13:32:18
【问题描述】:

首先我想问一下Xpath查询的输出格式是什么。

对我来说,当我查看输出的源代码时,我得到view-source

实际输出 - output

示例 xml - xmlfile

我的 php 代码 -

<?php

$variable=$_POST['module']; 
$xmldoc = new DOMDocument();
        $xmldoc->load('info.xml');

        $xpathvar = new Domxpath($xmldoc);

        $queryResult = $xpathvar->query("testcase[substring-after(
        substring-after(script, '/'),
        '/'
    ) = '$variable' or
    substring-before(
        substring-after(
            substring-after(script, '/'),
            '/'
        ),
        '/'
    ) = '$variable']"); 

foreach($queryResult as $var)
        {
                echo $var->textContent;
                echo "\n";
        }

?>

我想要的是得到以 .tcl 而不是全部内容结尾的字符串

请帮忙!!

【问题讨论】:

    标签: php xml xpath xml-parsing


    【解决方案1】:

    首先,您只寻找testcase 元素节点,文本节点的实际路径是/testcaseInfo/testcase,并且可以针对文档中的任何测试用例元素进行优化:

    //testcase

    接下来要验证一个元素是否以字符串结尾,您可以复制该部分字符串并进行比较。

    //testcase[ substring( script, string-length(script) - string-length('.tcl') + 1 ) = '.tcl' ]

    这将返回测试用例元素节点,现在您可以使用详细表达式来获取每个测试用例的数据:

    例子:

    $dom = new DOMDocument();
    $dom->loadXml($xml);
    $xpath = new DOMXpath($dom);
    
    $expression = "
      //testcase[
        substring(
          script, 
          string-length(script) - string-length('$module') + 1
        ) = '$module'
      ]
    ";
    
    // iterate test test cases and get name/script strings contents
    foreach ($xpath->evaluate($expression) as $testCase) {
      var_dump(
        $xpath->evaluate('string(name)', $testCase),
        basename($xpath->evaluate('string(script)', $testCase))
      );
    }     
    

    输出:https://eval.in/120110

    string(59) "802.1x_2.52_RADIUS_Accounting_AVP_contains_client_static_IP"
    string(31) "802dot1xRadAccAVPClntStatIp.tcl"
    string(27) "802.1x_1.02_Basic_User_Mode"
    string(25) "802dot1xBasicUserMode.tcl"
    string(44) "802.1x_2.47_RADIUS_Accounting_Enable_Disable"
    string(34) "802dot1xRadiusAccEnableDisable.tcl"
    string(31) "802.1x_2.14_RADIUS_Assigned_CoS"
    string(29) "802dot1xRadiusAssignedCos.tcl"
    ...
    

    【讨论】:

    • 第一个我想提取所有与脚本标签中的 $variable 内容匹配的测试用例。从该输出之后,我想获取以 .tcl 结尾的字符串
    • 第二个我只想在输出中有 802dot1xRadAsgEgVlanId.tcl, 802dot1xRadAsgEgVlanName.tcl !不是完整的脚本标签。
    • 我将变量 $module 命名为语义。在 PHP 中获取最后一部分会更容易,在脚本文件名上使用 basename()。
    • $variable=$_POST['module'];此变量包含用户给出的输入,其中主模块名称。在此之后,我想获取所有具有此 $variable 作为出现在第二个位置的字符串的测试用例内容。然后从上一个查询中获取的那些测试用例中,我想获取以脚本标记中的 .tcl 结尾的测试用例名称。
    • 您的问题表明“我想要的是获取以 .tcl 结尾的字符串” - 这将是脚本元素。我修改了答案以获取测试用例元素,对其进行迭代并获取每个元素的详细数据。
    猜你喜欢
    • 2014-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多