Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用Xpath根据节点值选择属性并列出值_Php_Xml_Xpath - Fatal编程技术网

Php 使用Xpath根据节点值选择属性并列出值

Php 使用Xpath根据节点值选择属性并列出值,php,xml,xpath,Php,Xml,Xpath,如何获取每个节点花的所有属性值ID <Files> <data id="1"> <Type>Flower</Type> </data> <data id="2"> <Type>Flower</Type> </data> <data id="3"> <Type>Flower</Type> </data> <data

如何获取每个节点花的所有属性值ID

<Files>
<data id="1"> 
   <Type>Flower</Type>
</data>
<data id="2">
   <Type>Flower</Type>
</data>
<data id="3">
   <Type>Flower</Type>
 </data>
<data id="4"> 
   <Type>Flower</Type>
 </data>
</Files>

要获取所有
@id
属性的值,请尝试

/Files/data[normalize-space(Type) = 'Flower']/@id

要获取所有
@id
属性的值,请尝试

/Files/data[normalize-space(Type) = 'Flower']/@id

您的XML无效,关闭根元素不匹配,
Type
元素关闭为
Type
。XML区分大小写

XPathWorks使用位置路径和条件位置路径是从当前上下文到元素的分层路径。它们返回一个节点列表。可以使用条件筛选列表

SimpleXMLElement对象有一个方法
xpath()
,用于在关联节点的上下文中执行表达式

$xml = <<<'XML'
<Files>
<data id="1"> 
   <type>Flower</type>
</data>
<data id="2">
   <type>Flower</type>
</data>
<data id="3">
   <type>Flower</type>
 </data>
<data id="4"> 
   <type>Flower</type>
 </data>
</Files>
XML;

$files = new SimpleXMLElement($xml);

$target = new SimpleXMLElement('<select/>');
foreach ($files->xpath('data[type = "Flower"]') as $data) {
echo '.';
  $option = $target->addChild('option', $data['id']);
  $option['value'] = $data['id'];
}
echo $target->asXml();

您的XML无效,关闭根元素不匹配,
Type
元素关闭为
Type
。XML区分大小写

XPathWorks使用位置路径和条件位置路径是从当前上下文到元素的分层路径。它们返回一个节点列表。可以使用条件筛选列表

SimpleXMLElement对象有一个方法
xpath()
,用于在关联节点的上下文中执行表达式

$xml = <<<'XML'
<Files>
<data id="1"> 
   <type>Flower</type>
</data>
<data id="2">
   <type>Flower</type>
</data>
<data id="3">
   <type>Flower</type>
 </data>
<data id="4"> 
   <type>Flower</type>
 </data>
</Files>
XML;

$files = new SimpleXMLElement($xml);

$target = new SimpleXMLElement('<select/>');
foreach ($files->xpath('data[type = "Flower"]') as $data) {
echo '.';
  $option = $target->addChild('option', $data['id']);
  $option['value'] = $data['id'];
}
echo $target->asXml();

这就是我使用答案的方式。如果你喜欢,请随意使用代码。 谢谢


这是我如何使用答案的。如果您愿意,请随意使用代码。
谢谢


感谢您选择作为答案,因为它比前面的答案更简单!虽然两者都很好。谢谢选择作为答案,因为它比前面的答案更简单!虽然两个都很好,谢谢!但我得到了一个更简单的语法答案。谢谢!但我得到了一个更简单的答案。
$source = new DOMDocument();
$source->loadXml($xml);
$xpath = new DOMXpath($source);
$target = new DOMDocument();
$select = $target->appendChild($target->createElement('select'));

foreach ($xpath->evaluate('/Files/data[type = "Flower"]') as $data) {
  $option = $select->appendChild($target->createElement('option'));
  $option->setAttribute('value', $data->getAttribute('id'));
  $option->appendChild($target->createTextNode($data->getAttribute('id')));
}
echo $target->saveHtml($select);
<?php
//I have used 2 given answer as example on how i used it. Feel Free to use the code below
$type = $_GET['type'];
if(file_exists("xml/data.xml")) {
$xml = simplexml_load_file('xml/data.xml') or die("Data Missing"); }
<!-- Code Example 1 -->
$ids = $xml->xpath('//data[(./Type/text()="'.$type.'")]/@id');
<!-- Code Example 2 -->
$idx = $xml->xpath('/Files/data[normalize-space(Type) = "'.$type.'"]/@id');
?>
<!-- Example 1 -->
<select>
  <?php
//echo $ids[0];
foreach ($ids as $id) {
echo '<option value="'.$id[0].'">'.$id[0].'</option>';
} 
?>
</select>
<!-- Example 2 -->
<select>
  <?php
//echo $ids[0];
foreach ($idx as $id2) {
echo '<option value="'.$id2[0].'">'.$id2[0].'</option>';
} 
?>
</select>
<a href="logout.php">Logout
</a>