首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何处理XML Dom?

如何处理XML Dom?
EN

Stack Overflow用户
提问于 2014-02-15 16:57:51
回答 3查看 34关注 0票数 0

我是xml的新手,我试图检索'‘标记中的值。问题是,我不知道如何降低到这个水平。我试过这样做:

代码语言:javascript
运行
复制
itemXML.getElementById("gender").getElementsByTagName("item").nodeValue;

但是,如果返回“未定义”,我将如何指定要检索哪个标记的值?

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

代码语言:javascript
运行
复制
  <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>

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-02-15 17:14:58

代码语言:javascript
运行
复制
$xpath = new DOMXPath($itemXML);

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

foreach ($genderItems as $genderItem) {

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

}
票数 0
EN

Stack Overflow用户

发布于 2014-02-15 17:05:08

代码语言:javascript
运行
复制
$items = $doc->getElementsByTagName('item'); 
票数 0
EN

Stack Overflow用户

发布于 2014-02-15 17:46:25

XML中没有命名空间前缀的id属性只是一个普通属性,仅在html中是标识符。因此,在xml文档中,属性名必须是"xml:id“,才能由getElementById()找到。getElementsByTagName()方法返回元素节点的列表,而不仅仅是一个。您必须使用foreach()item()方法来访问列表中的元素。

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

下面是一些演示源:

代码语言:javascript
运行
复制
$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"
*/
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21800711

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档