提问人:Maciek 提问时间:8/15/2023 更新时间:8/15/2023 访问量:47
PHP 解析 XML 以获取多个深度的所有字符串值
PHP Parsing XML to Get All String Values At Multiple Depths
问:
我有一个类似于以下示例的 XML:
<article>
<body>
<title>I <underline><bold>LOVE</bold></underline> Coding</title>
</body>
</article>
我想获取节点标题的全文。
$xml=simplexml_load_file("file.xml");
$title=$xml->xpath('//title')??[];
echo (string)$title;
我似乎无法更深入地抓住带下划线/粗体的 XML 部分。
我希望结果是一个字符串。I LOVE Coding
我怎样才能做到这一点?我只是得到.I Coding
我也试过了,但得到的结果是空的。xpath('string(//title)')
答:
1赞
Dirk J. Faber
8/15/2023
#1
您需要像这样剥离内部的标签:<title>
$xmlFile = simplexml_load_file('file.xml');
$title = strip_tags($xmlFile->body->title->asXML());
echo $title;
或者,如果你的 XML 不是文件,而是字符串:
$xmlString = '<article>
<body>
<title>I <underline><bold>LOVE</bold></underline> Coding</title>
</body>
</article>';
$xml = simplexml_load_string($xmlString);
$title = strip_tags($xml->body->title->asXML());
echo $title;
评论
0赞
Dirk J. Faber
8/15/2023
有关交互式示例,请参见:3v4l.org/SYgPm。
1赞
Olivier
8/15/2023
#2
你可以调用 dom_import_simplexml()
来
检索 DOM 元素,然后使用 textContent
属性:
$xml = <<<XML
<article>
<body>
<title>I <underline><bold>LOVE</bold></underline> Coding</title>
</body>
</article>
XML;
$doc = simplexml_load_string($xml);
$title = $doc->xpath('//title')[0];
$dom = dom_import_simplexml($title);
echo $dom->textContent;
结果:
I LOVE Coding
3赞
Sammitch
8/15/2023
#3
坦率地说,SimpleXML不是一个好的接口。这很简单,因为它没有太多内容,但也很简单,因为有相当多的缺失,而且经常最终需要更多的工作。
DomDocument 功能更全面,而且与 IMO 合作得更好。
$xml = <<<_E_
<article>
<body>
<title>I <underline><bold>LOVE</bold></underline> Coding</title>
</body>
</article>
_E_;
$d = new DomDocument();
$d->loadXml($xml);
$x = new DomXPath($d);
$r = $x->query('//title');
var_dump($r[0]->textContent);
输出:
string(13) "I LOVE Coding"
评论
0赞
IMSoP
8/16/2023
我认为更多的情况是,SimpleXML 针对处理树状 XML 进行了优化,而 DOM 针对处理类似标记的 XML(和 HTML)进行了优化。例如,在 SimpleXML 中定位特定元素就像 一样简单,在 DOM 中,这需要多次调用 ,或者使用 XPath(带有单独的对象)。别忘了你可以自由地混合它们 - 基本上没有调用和的惩罚,因为它们都在内部包装了相同的表示。$xml->body->title->underline->bold;
getElementsByName
DomXPath
dom_import_simplexml
simplexml_import_dom
评论