解析包含 php 中文本封装节点的 DITA / XML 文件

Parsing DITA / XML files with text encapsulated nodes in php

我正在尝试解析一个 .dita 文件,但是在另一个节点中有一个节点,虽然这并不奇怪,但实际上内部节点周围有文本,它看起来有点像这个:

<node>
    Hello this is a <xlink src="example.com">LINK</xlink> that you may click
</node>

我可以从 node 获取文本并且可以获取 xlink 的所有实例,但是 node 的文本将如下所示:

Hello this is a  that you may click

如您所见,单词 LINK 丢失了,即使我可以调用 xlink 节点并获得包含单词 LINK 的数组,它也没有到目前为止,可以将单词放回去,因为它们的位置未知。

我必须补充一点,检查 2 个空格是行不通的,因为原文中也可能有 2 个空格,因此单词的位置将不正确。

DOMElement::$textContent包含所有后代节点的文本内容。

如果您通过 Xpath 表达式获取值,您可以使用 string() 函数将第一个节点转换为字符串 - 返回其文本内容。

$xml = <<<'XML'
<node>
    Hello this is a <xlink src="example.com">LINK</xlink> that you may click
</node>
XML;

$document = new DOMDocument();
$document->loadXml($xml);
$xpath = new DOMXpath($document);

// access the text conent of the node element
var_dump($document->documentElement->textContent);

// use Xpath string() function
var_dump($xpath->evaluate('string(self::node)', $document->documentElement));

输出:

string(45) "
    Hello this is a LINK that you may click
"
string(45) "
    Hello this is a LINK that you may click
"

这可以通过使用正则表达式操作模块导入来解决:

  • import xml.etree.ElementTree as ET
  • import re

将此 python 函数添加到您的代码中 将节点的引用传递给此函数。

def getTextFromTagNode(node):
    textString = re.sub(r"(<.*?>)", '', ET.tostring(node).decode("utf-8"))
    return textString

textStringreturns想要的结果。 该函数删除所有标签并留下文本。

如果字符串中有\n,将其替换为空字符串。 希望这有帮助