<order>
XXX
<orderValue>YYY</orderValue>
</order>
我无法弄清楚如何获得纯 XXX (使用PHP的SimpleXMLElement),因为它无法通过直接标记访问。 $ order-&gt; orderValue 肯定会提供 YYY , $ order 将提供订单标记内的所有内容。根据codebeautify.org-validator和xmlwf-shell-validator,XML是有效的。
答案 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 的界面无法将您在此处混合的子节点处理到您可能需要的详细程度:
"XXX"
<orderValue>
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姐妹库提供的更详细的访问中受益。