Проблемы с простым запросом XML Xpath

#php #xml #xpath #simplexml

#php #xml #xpath #simplexml

Вопрос:

Совершенно новичок в использовании библиотеки simple XML в PHP и использовал синтаксис w3 xpath для помощи.

У меня есть XML-файл, который выглядит примерно так:

 <Xml_Configs>
<Foo_Module>
   <Front_Name>a</Front_Name>
</Foo_Module>
<Bar_Module>
   <Front_Name>b</Front_Name>
</Bar_Module>
<Baz_Module>
   <Front_Name>c</Front_Name>
</Baz_Module>
</Xml_Configs>
  

Я пытаюсь выяснить, какой модуль имеет Front_Name из b . Прямо сейчас я только пытался сопоставить только атрибут, не заботясь о получении родительского элемента, и вот что я попробовал:

 $xmlObj->xpath('/Xml_Configs/*[@Front_Name="b"]');
  

Однако это ничего мне не дает: «/Xml_Configs/*/ Front_Name» дает мне массив простых xml-объектов с a, b и c . И «/Xml_Configs/*/[@Front_Name= «b»]» выдает мне недопустимые ошибки выражения.

Любая помощь, которую вы можете оказать, приветствуется, спасибо!

Ответ №1:

Я пытаюсь выяснить, какой модуль имеет Front_Name из b

     `$xmlObj->xpath('/Xml_Configs/*[@Front_Name="b"]');`

 That gets me nothing
  

Да, потому что ни один из элементов, которые являются дочерними элементами верхнего элемента Xml_Configs , не имеет никаких атрибутов.

Вы хотите:

 /*/*[Front_Name = 'b']
  

При этом выбираются все дочерние элементы верхнего элемента, у которых есть дочернее имя со Font_Name строковым значением "b" .

Проверка на основе XSLT:

 <xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/">
  <xsl:copy-of select="/*/*[Front_Name = 'b']"/>
 </xsl:template>
</xsl:stylesheet>
  

когда это преобразование применяется к предоставленному XML-документу:

 <Xml_Configs>
    <Foo_Module>
        <Front_Name>a</Front_Name>
    </Foo_Module>
    <Bar_Module>
        <Front_Name>b</Front_Name>
    </Bar_Module>
    <Baz_Module>
        <Front_Name>c</Front_Name>
    </Baz_Module>
</Xml_Configs>
  

он копирует на вывод выбранный узел:

 <Bar_Module>
   <Front_Name>b</Front_Name>
</Bar_Module>
  

Я бы рекомендовал вам приобрести XPath Visualizer — инструмент, который помог тысячам разработчиков изучить XPath, одновременно получая удовольствие.