Php 使用SimpleXMLElement获取未知元素名称的Xpath表达式

Php 使用SimpleXMLElement获取未知元素名称的Xpath表达式,php,xml,xpath,simplexml,expression,Php,Xml,Xpath,Simplexml,Expression,我正试图编写一个xpath表达式,根据一些标准从xml中获取元素名称 我要做的事情是获取每个元素的元素名列表,其中包含子节点“fields/enable”。我不知道元素的名称是什么,我没有任何属性可以触发,元素可以是任何xml可接受的名称 在下面的示例中,iam对以下结果感兴趣: ajob bjob cjob 我设法为我感兴趣的每个节点标记名称。在本例中,标签名称与我想要的元素名称完全相同,但我不能保证标签不会更改。我唯一确定的是元素名 ->xpath("//wrapper/group

我正试图编写一个xpath表达式,根据一些标准从xml中获取元素名称

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

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

ajob
bjob
cjob 
我设法为我感兴趣的每个节点标记名称。在本例中,标签名称与我想要的元素名称完全相同,但我不能保证标签不会更改。我唯一确定的是元素名

->xpath("//wrapper/groups/*/fields/enable/../../label");
我在谷歌上搜索了一下,并通过使用if name()的不同组合获得了一些点击率。我从未尝试过让name()返回任何值

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

我已经简化了下面的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>

问询处
日程
一份工作
1.
日程
比约布
1.
问询处
克雅伯
1.

下面的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>

现场观看:

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

对于使用PHP、SimpleXML的给定XML,对您提供的
//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";
}
$sxe=新的simplexmlement($xml);
$element=$sxe->xpath(//wrapper/groups//fields[enable=1]/../label”);
foreach($element作为$node)
{
echo$node“
”; }
谢谢罗兰多!在我的程序中,xsd文件将使用查找所有节点名称和要打印的每个节点的父节点的方法给出。这是动态编码中必须的。?我建议你尽可能详细地回答一个新问题,以便更好地回答你的新问题。
<?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
$sxe = new SimpleXMLElement($xml);
$element = $sxe->xpath("//wrapper/groups//fields[enable=1]/../label");

foreach($element as $node)
{
  echo $node,"<br/>";
}