php - 获取标签中没有的XML内容,并通过前面的标签将它们分成数组
问题描述
这是我的 XML 内容:
<paragraph>
<textInfo number="1" />Example text one.<textInfo number="2"/>Example text two
</paragraph>
我想解析它并创建这样的数组:
$array = (
1 => "Example text one",
2 => "Example text two"
);
我试过这个:
$xml = simplexml_load_file($file);
var_dump(explode("<textInfo/>", $xml));
结果是只有一个键的数组,所以在explode函数中可能看不到html标签:
array(1) {
[0]=>
string(37) "
Example text one.Example text two
"
}
也试过这个,但它只给了我两个空对象:
$paragraphs = $xml->xpath('//textInfo');
你能建议解决方案吗?
解决方案
将explode()
转换paragraph
SimpleXMLElement
为字符串。这将返回文本内容。
$xml = <<<'XML'
<paragraph>
<textInfo number="1" />Example text one.<textInfo number="2"/>Example text two
</paragraph>
XML;
$p = simplexml_load_string($xml);
var_dump($p->getName(), (string)$p);
输出:
string(9) "paragraph"
string(39) "
Example text one.Example text two
"
您可以text()
在 Xpath 表达式中使用来寻址文本节点。但是,这似乎不适用于 SimpleXML。它返回父元素节点:
$p = simplexml_load_string($xml);
$text = $p->xpath('/paragraph/text()')[0];
var_dump($text->getName(), (string)$text);
输出:
string(9) "paragraph"
string(39) "
Example text one.Example text two
"
所以你可能需要使用 DOM。在 DOM 中,任何东西都是节点。这使您可以获取单独的文本节点:
$document = new DOMDocument();
$document->loadXML($xml);
$xpath = new DOMxpath($document);
foreach ($xpath->evaluate('/paragraph/text()') as $text) {
var_dump($text->textContent);
}
输出:
string(5) "
"
string(17) "Example text one."
string(17) "Example text two
"
此示例中的第一个文本节点是第一个 . 之前的换行符和缩进空格<textInfo/>
。这是一种识别这种文本节点的方法:
$lines = [];
foreach ($xpath->evaluate('/paragraph/text()') as $text) {
if (!$text->isWhitespaceInElementContent()) {
$lines[] = $text->textContent;
}
}
var_dump($lines);
输出:
array(2) {
[0]=>
string(17) "Example text one."
[1]=>
string(17) "Example text two
"
}
推荐阅读
- javascript - 为什么使用 jquery.find(":input") 添加动态输入时无法获取输入元素?
- git - 执行请求的更改而不是拉取请求的所有者
- git - git - 将分阶段的更改提交到另一个分支并合并
- selenium-webdriver - 使用 RetryAnalyzer 运行失败的测试 - 使用数据提供者的测试没有按预期工作
- sql - 左连接不返回空记录
- javascript - 如何解决 React 和 Redux throwing Cannot read property 'props' of undefined error?
- html - CSS中的垂直线和水平线
- pyspark - 你将如何在窗口上生成一个新的数组列?
- mysql - 在node.js-mysql中选择带有where子句的查询?
- javascript - 如何使用 javascript 在 Dynamics CRM 的子网格中获取活动列表?