【问题标题】:Xpath expression to get unknown element names with SimpleXMLElement使用 SimpleXMLElement 获取未知元素名称的 Xpath 表达式
【发布时间】:2013-11-05 23:47:27
【问题描述】:

我正在尝试编写一个 xpath 表达式以根据某些条件从 xml 中获取元素名称。

iam 之后的事情是获取具有子节点“fields/enable”的每个元素的元素名称列表。我不知道元素的名称是什么,我没有任何属性可以触发,元素可以是任何 xml 可接受的名称。

在下面的示例中,我对以下结果感兴趣:

ajob
bjob
cjob 

我设法为我感兴趣的每个节点设置了标签名称。在这个例子中,标签名称与我想要的元素名称完全相同,但我不能相信标签不会改变。我唯一确定的是元素名称。

->xpath("//wrapper/groups/*/fields/enable/../../label");

我对此进行了谷歌搜索,并通过使用 if name() 的不同组合获得了几个命中。我从未设法让 name() 返回任何值。

->xpath("//wrapper/groups/*/fields//enable/../name(parent::*)");

->xpath("name(//wrapper/groups/*/fields/enable/../..)");

我已经简化了下面的 XML 示例,但基本结构和感兴趣的元素仍然存在

如果我能得到任何帮助,我将不胜感激。

<?xml version="1.0" encoding="UTF-8"?>
<config>
   <wrapper>
      <groups>
         <ainfo>
            <label>Information</label>
         </ainfo>
         <atimer>
            <label>Schedule</label>
            <fields>
               <time />
               <frequency />
            </fields>
         </atimer>
         <ajob>
            <label>ajob</label>
            <fields>
               <enable>1</enable>
            </fields>
         </ajob>
         <btimer>
            <label>Schedule</label>
            <fields>
               <time />
               <frequency />
            </fields>
         </btimer>
         <bjob>
            <label>bjob</label>
            <fields>
               <enable>1</enable>
            </fields>
         </bjob>
         <cinfo>
            <label>Information</label>
         </cinfo>
         <cjob>
            <label>cjob</label>
            <fields>
               <enable>1</enable>
            </fields>
         </cjob>
      </groups>
   </wrapper>
</config>

【问题讨论】:

    标签: php xml xpath simplexml expression


    【解决方案1】:

    对于给定的 XML here's a working solution,使用 PHP、SimpleXML 和对您提供的 //wrapper/groups/*/fields/enable/../../label XPath 表达式的微小更改:

    <?php
    $xml = <<<XML
    <?xml version="1.0" encoding="UTF-8"?>
    <config>
       <wrapper>
          <groups>
             <ainfo>
                <label>Information</label>
             </ainfo>
             <atimer>
                <label>Schedule</label>
                <fields>
                   <time />
                   <frequency />
                </fields>
             </atimer>
             <ajob>
                <label>ajob</label>
                <fields>
                   <enable>1</enable>
                </fields>
             </ajob>
             <btimer>
                <label>Schedule</label>
                <fields>
                   <time />
                   <frequency />
                </fields>
             </btimer>
             <bjob>
                <label>bjob</label>
                <fields>
                   <enable>1</enable>
                </fields>
             </bjob>
             <cinfo>
                <label>Information</label>
             </cinfo>
             <cjob>
                <label>cjob</label>
                <fields>
                   <enable>1</enable>
                </fields>
             </cjob>
          </groups>
       </wrapper>
    </config>
    XML;
    
    $sxe           = new SimpleXMLElement($xml);
    $enabledLabels = $sxe->xpath('//wrapper/groups/*/fields/enable[.=1]/../../label');
    
    foreach ($enabledLabels as $enabledLabel) {
        echo "$enabledLabel\n";
    }
    

    输出:

    ajob
    bjob
    cjob
    

    【讨论】:

    • 谢谢罗兰多!在我的程序中,将使用查找所有节点名称和要打印的每个节点的父节点来给出 xsd 文件。它必须采用动态编码。?有什么想法可以做到这一点stackoverflow.com/questions/35865892/…
    • 我建议您打开一个尽可能详细的新问题,以便更好地回答您的新问题。
    【解决方案2】:

    下面的 XSLT 应该可以满足您的需求:

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    
      <xsl:template match="/">
        <xsl:for-each select="//*[fields/enable=1]">      
          <xsl:value-of select="name(current())" />      
        </xsl:for-each>
      </xsl:template>
    
    </xsl:stylesheet>
    

    现场观看:http://www.xsltcake.com/slices/JYfpsX/3

    您可以使用 xpath 检索一组节点,然后您可以在 PHP 中循环并在每次迭代中检索节点的名称。 PHP DOMNode 类 (http://php.net/manual/en/class.domnode.php) 有一个名为“nodeName”的属性。

    【讨论】:

      【解决方案3】:
      $sxe = new SimpleXMLElement($xml);
      $element = $sxe->xpath("//wrapper/groups//fields[enable=1]/../label");
      
      foreach($element as $node)
      {
        echo $node,"<br/>";
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-11-17
        • 2013-02-02
        • 1970-01-01
        • 2011-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多