Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.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 通过XMLDOM工作?_Php_Xml_Dom_Tree - Fatal编程技术网

Php 通过XMLDOM工作?

Php 通过XMLDOM工作?,php,xml,dom,tree,Php,Xml,Dom,Tree,我是XMLDOM新手,我正在尝试检索标记中的值。 问题是我不知道如何在dom中工作到那个级别。 我尝试过这样做: itemXML.getElementById("gender").getElementsByTagName("item").nodeValue; 但是如果返回“undefined”,我将如何指定要检索其值的标记 以下是我的xml文档的内容: <dataFields> <items id="gender"> <item&g

我是XMLDOM新手,我正在尝试检索标记中的值。 问题是我不知道如何在dom中工作到那个级别。 我尝试过这样做:

itemXML.getElementById("gender").getElementsByTagName("item").nodeValue;
但是如果返回“undefined”,我将如何指定要检索其值的标记

以下是我的xml文档的内容:

  <dataFields>
    <items id="gender">
          <item>Male</item>
      <item>Female</item>
    </items>
<items id="age">
    <item>0-3 years</item>
    <item>3-6 years</item>
    <item>7-16 years</item> 
    <item>17-25 years</item>
    <item>26-40 years</item>
    <item>41-65 years</item> 
    <item>65+ years</item>
</items>
没有名称空间前缀的XML中的id属性只是普通属性,只有在html中它才是标识符。因此,在xml文档中,属性名必须是xml:id才能由getElementById找到。getElementsByTagName方法返回元素节点列表,而不仅仅是一个。您必须使用foreach或item方法来访问列表中的元素

但这里有一个更简单的方法。DOMXpath:evaluate允许您使用xpath表达式从DOM获取节点和值

以下是一些演示源:

$xml = <<<'XML'
<dataFields>
  <items id="gender" xml:id="xml_gender">
    <item>Male</item>
    <item>Female</item>
  </items> 
  <items id="age">
    <item>0-3 years</item>
    <item>3-6 years</item>
    <item>7-16 years</item> 
    <item>17-25 years</item>
    <item>26-40 years</item>
    <item>41-65 years</item> 
    <item>65+ years</item>
  </items>
</dataFields>
XML;

$dom = new DOMDocument();
$dom->loadXml($xml);

// difference between id and xml:id
var_dump(
  $dom->getElementById('gender'),
  get_class($dom->getElementById('xml_gender'))
);
/* Output:
NULL
string(10) "DOMElement"
*/

// getElementsByTagName returns a node list
var_dump(
  get_class($dom->getElementById('xml_gender')->getElementsByTagName('item'))
);
/* Output:
NULL
string(11) "DOMNodeList"
*/

// you can iterate node lists
foreach ($dom->getElementById('xml_gender')->getElementsByTagName('item') as $item) {
  var_dump($item->nodeValue);
}
/* Output:
string(4) "Male"
string(6) "Female"
*/

// it is easier with xpath
$xpath = new DOMXpath($dom);
foreach ($xpath->evaluate('//items[@id = "gender"]/item') as $item) {
  var_dump($item->nodeValue);
}
/* Output:
string(4) "Male"
string(6) "Female"
*/

// DOMXpath::evaluate() can be used to fetch values directly, too.
var_dump(
  $xpath->evaluate('string(//items[@id = "gender"]/item[2])')
);
/* Output:
string(6) "Female"
*/

嗯,这比我想做的要好一百万倍。我刚刚实现了它,它完全满足了我的需要,但比我将要使用的代码少了100行。非常感谢!
$xpath = new DOMXPath($itemXML);

$genderItems = $xpath->query('/dataFields/items[@id="gender"]/item');

foreach ($genderItems as $genderItem) {

    echo $genderItem->nodeValue . "\n"; // "Male", "Female"

}
$xml = <<<'XML'
<dataFields>
  <items id="gender" xml:id="xml_gender">
    <item>Male</item>
    <item>Female</item>
  </items> 
  <items id="age">
    <item>0-3 years</item>
    <item>3-6 years</item>
    <item>7-16 years</item> 
    <item>17-25 years</item>
    <item>26-40 years</item>
    <item>41-65 years</item> 
    <item>65+ years</item>
  </items>
</dataFields>
XML;

$dom = new DOMDocument();
$dom->loadXml($xml);

// difference between id and xml:id
var_dump(
  $dom->getElementById('gender'),
  get_class($dom->getElementById('xml_gender'))
);
/* Output:
NULL
string(10) "DOMElement"
*/

// getElementsByTagName returns a node list
var_dump(
  get_class($dom->getElementById('xml_gender')->getElementsByTagName('item'))
);
/* Output:
NULL
string(11) "DOMNodeList"
*/

// you can iterate node lists
foreach ($dom->getElementById('xml_gender')->getElementsByTagName('item') as $item) {
  var_dump($item->nodeValue);
}
/* Output:
string(4) "Male"
string(6) "Female"
*/

// it is easier with xpath
$xpath = new DOMXpath($dom);
foreach ($xpath->evaluate('//items[@id = "gender"]/item') as $item) {
  var_dump($item->nodeValue);
}
/* Output:
string(4) "Male"
string(6) "Female"
*/

// DOMXpath::evaluate() can be used to fetch values directly, too.
var_dump(
  $xpath->evaluate('string(//items[@id = "gender"]/item[2])')
);
/* Output:
string(6) "Female"
*/