首页 > 解决方案 > 获取标签中没有的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');

你能建议解决方案吗?

标签: phpxmlparsing

解决方案


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
"
}

推荐阅读