如何使用SimpleXml获取元素的innerText

noC*_*lue 5 php simplexml

我对SimpleXml还是比较新的.我正在做的事情:

我有很多xml文件,它们的构建大致相同.我的问题是我的目标节点中有时会有更多节点.示例(试图获取身体):

xml文件1

<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<firstname>My name is WHAT</firstname>
<lastname>My name is WHO</lastname>
<body>My name is CHIKA CHIKA Slim-Shady</body>
</note>
Run Code Online (Sandbox Code Playgroud)

xml文件2

<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<firstname>My name is WHAT</firstname>
<lastname>My name is WHO</lastname>
<body><b>My name is CHIKA CHIKA Slim-Shady</b></body>
</note>
Run Code Online (Sandbox Code Playgroud)

我可以在第一个文件中获取文本没有问题:

$xml = simplexml_load_file("filename.xml");
echo $xml->note->body;
Run Code Online (Sandbox Code Playgroud)

但是当我尝试在第二个文件中执行相同操作时,我什么也得不到.

我怎样才能让PHP只在节点中吐出文本,而不考虑目标节点中的任何其他节点?

Gor*_*don 13

为了遍历

echo $xml->note->body;
Run Code Online (Sandbox Code Playgroud)

要工作,你的标记需要

<note>
    <note>
        <body>
        …
Run Code Online (Sandbox Code Playgroud)

为避免此类错误,最好simplexml_load_file将标记中的变量命名为标记中的根元素,例如

$note = simplexml_load_string($xml);
Run Code Online (Sandbox Code Playgroud)

要获取SimpleXmlElement的"innerText",您可以执行以下操作:

echo strip_tags($note->body->asXml());
Run Code Online (Sandbox Code Playgroud)

asXML()方法将为您提供"outerXML",然后将其删除strip_tags.

另一种方法是将节点导入DOM然后获取它 nodeValue

echo dom_import_simplexml($note->body)->nodeValue;
Run Code Online (Sandbox Code Playgroud)

  • 我讨厌人们在这样的讨论中只是说“我让它工作了”而不是发布他们如何让它工作顺便说一句。strip_tags 将删除所有标签,包括来自innerXml的标签 (2认同)