【问题标题】:Working through the XML Dom?通过 XML Dom 工作?
【发布时间】:2014-02-15 16:57:51
【问题描述】:

我是 xml dom 的新手,我正在尝试检索 '' 标记中的值。 问题是我不确定如何在 dom 中工作到那个级别。 我试图做这样的事情:

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>

【问题讨论】:

标签: php xml dom tree


【解决方案1】:
$xpath = new DOMXPath($itemXML);

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

foreach ($genderItems as $genderItem) {

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

}

【讨论】:

  • 嗯,这比我尝试做的要好一百万倍。我刚刚实现了它,它完全符合我的需要,但代码行数比我打算使用的少了一百行。非常感谢!
【解决方案2】:
$items = $doc->getElementsByTagName('item'); 

【讨论】:

    【解决方案3】:

    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"
    */
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-24
      • 2012-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多