如何获取"外部"的XML内容标签(使用PHP' SimpleXMLElement)?

时间:2015-03-27 11:06:56

标签: php xml

XML:

<order>
    XXX
    <orderValue>YYY</orderValue>
</order>

问题:

我无法弄清楚如何获得纯 XXX (使用PHP的SimpleXMLElement),因为它无法通过直接标记访问。 $ order-&gt; orderValue 肯定会提供 YYY $ order 将提供订单标记内的所有内容。根据codebeautify.org-validator和xmlwf-shell-validator,XML是有效的。

2 个答案:

答案 0 :(得分:2)

您不需要定位任何内容,您已经在具有您想要获得的值的节点上

$xml = simplexml_load_string('
  <order>
      XXX
      <orderValue>YYY</orderValue>
  </order>
');
echo $xml;

输出XXX

在某些情况下,您可能必须使用echo (string) $xml;

答案 1 :(得分:1)

您拥有的XML:

<order>
    XXX
    <orderValue>YYY</orderValue>
</order>
从技术上讲,

与PHP中的Simplexml 不兼容。尽管Clément Malet outlined这个小片段在他的答案中提到的孤立示例中起作用,但你指的是更常见的问题,即Simplexml与数据访问不兼容文档节点的区别(和可能)安排。

不要误解我的意思,XML 有效并且Simplexml会加载它(它也不会破坏文档)。但 SimpleXMLElement 的界面无法将您在此处混合的子节点处理到您可能需要的详细程度:

  1. 文本节点"XXX"
  2. 元素节点<orderValue>
  3. Simplexml通过技术上允许父元素只有一种类型的子节点,简化了对XML文档中数据的访问。所以只有元素或文字。

    对于更加有区别的一切,the sister-library named Dom可以互换。通过扩展 SimpleXMLElement ,您甚至可以在此处为现有代码创建一些扩展,而无需更改太多内容。

    让我们为 SimpleXMLElement 添加一个新方法,它返回您感兴趣的任何元素的所有子节点(文本节点和元素节点)并命名该方法 childNodes

    /**
     * Extend SimpleXMLElement to access child-nodes more differentiated.
     *
     * Demonstration to work together with DOM sister library
     */
    class MyXml extends SimpleXMLElement
    {
        public function childNodes() {
            $nodes = [];
            foreach(dom_import_simplexml($this)->childNodes as $node) {
                if ($node instanceof DOMText) {
                    $nodes[] = $node->nodeValue;
                } elseif ($node instanceof DOMElement) {
                    $nodes[] = simplexml_import_dom($node);
                } // ... other node-types ignored in this example
            }
            return $nodes;
        }
    }
    

    根据您创建 SimpleXMLElement 的方式,您可以传递一些参数,告知要使用哪个 SimpleXMLElement 类。这是我的一个字符串示例:

    $buffer = <<<XML
    <doc>
      <order>
          XXX <!-- XXX is never reachable as-is with pure SimpleXML -->
          <orderValue>YYY</orderValue>
          ZZZ <!-- same for ZZZ -->
      </order>
    </doc>
    XML;
    
    $xml = simplexml_load_string($buffer, 'MyXml');
    

    我使用simplexml_load_string函数创建SimpleXMLElement。它有第二个参数,我可以传递要使用的类名。这允许您使用添加的方法:

    var_dump($xml->order->childNodes()[0]); // first child-node string(11) "\n      XXX "
    

    正如您所看到的,您可能无法使用“纯”Simplexml进行此操作,但您可以扩展界面并从DOM姐妹库提供的更详细的访问中受益。