我是xml的新手,我试图检索'‘标记中的值。问题是,我不知道如何降低到这个水平。我试过这样做:
itemXML.getElementById("gender").getElementsByTagName("item").nodeValue;
但是,如果返回“未定义”,我将如何指定要检索哪个标记的值?
以下是我的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>
发布于 2014-02-15 17:14:58
$xpath = new DOMXPath($itemXML);
$genderItems = $xpath->query('/dataFields/items[@id="gender"]/item');
foreach ($genderItems as $genderItem) {
echo $genderItem->nodeValue . "\n"; // "Male", "Female"
}
发布于 2014-02-15 17:05:08
$items = $doc->getElementsByTagName('item');
发布于 2014-02-15 17:46:25
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"
*/
https://stackoverflow.com/questions/21800711
复制相似问题