【问题标题】:PHP: XML parsing questionPHP:XML解析问题
【发布时间】:2010-11-26 22:16:33
【问题描述】:

我正在使用 SimpleXML 来解析 XMl 文档。 我需要能够读取/更新节点属性。

在这个 XML 文档中

<root>
  <node>ABC</node>
  <key>123</key>
  <node2>
     <key>456</key>
  </node2>
  <key>789</key>
</root>

如何读取/更新所有关键节点?该文档没有特定的结构,因此我需要能够在不知道它们的位置的情况下找到它们。假设我想将关键节点中的数字乘以 2。我该怎么做?

Tks.

【问题讨论】:

  • 你的名字是“fast-dev”,因为你的所有代码都写在 Stack Overflow 上吗? ;)
  • @Orbling 问很多问题是可以的,最好是具体问题而不是写我的一堆代码
  • @cambraca 是的,我正在等待有人说“我要建立一个网站,这是规范,有 15 个声望可供第一个完成”。我知道就业市场很糟糕......
  • @fast-dev 与其说是你的问题的频率,不如说是质量。您的问题是有效的(这就是我没有 dv 的原因),但是 SO 在提问之前要求您“做功课”。可以轻松找到如何使用 SimpleXml 更改属性等基本操作(与其他问题的解决方案不同;您删除的那个)

标签: php xml parsing simplexml xml-parsing


【解决方案1】:

我觉得这个问题非常懒惰,但无论如何

$sxe = new SimpleXmlElement($xml);
foreach($sxe->xpath('//key') as $key) $key[0] *= 2;
echo $sxe->asXML();

有很多questions about SimpleXml on Stack Overflow。请在asking your question前搜索。 PHP 手册还包含涵盖Basic Usage 的示例。

【讨论】:

    【解决方案2】:
    <?php
    
    $xml = '<root>
      <node>ABC</node>
      <key>123</key>
      <node2>
         <key>456</key>
      </node2>
      <key>789</key>
    </root>';
    
    $dom = new DOMDocument();
    $dom->loadXml($xml);
    
    $xpath = new DOMXPath($dom);
    foreach ($xpath->query('//text()') as $node)
    {
     $newNode = $dom->createDocumentFragment();
     $newNode->appendXML($node->wholeText . ' replaced');
     $node->parentNode->replaceChild($newNode, $node);
    }
    
    echo $dom->saveXML();
    

    【讨论】:

    • 嗯,但这并没有按照要求使用 SimpleXml(尽管我也更喜欢 DOM),它也没有将关键元素值乘以 2 并将字符串“replaced”添加到现有的 wholeText ,您可以简单地使用$node-&gt;appendData(' replaced'); 而不是用片段替换整个节点。但基本上,您甚至根本不需要查询文本节点,只需查询关键元素并更改它们的 nodeValue。
    • 我知道,我知道。这就是我添加细节的原因。但我指出它的主要原因是,当 OP 似乎与所要求的完全不同时,它接受了它。但那是 StackOverflow :)
    【解决方案3】:

    最简单的 API 是 QueryPath(或 phpQuery):

    $qp = qp($xml);
    
    foreach ($qp->find("key") as $key) {
         //@todo: add verification that it's indeed numeric text
         $key->text(  $key->text() * 2  );
    }
    

    但“SimpleXML”也有类似的可能

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-16
      • 2015-09-30
      • 2011-07-25
      • 2012-08-01
      • 2012-08-01
      • 2011-11-05
      相关资源
      最近更新 更多