解析包含 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
textString
returns想要的结果。
该函数删除所有标签并留下文本。
如果字符串中有\n
,将其替换为空字符串。
希望这有帮助
我正在尝试解析一个 .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
textString
returns想要的结果。
该函数删除所有标签并留下文本。
如果字符串中有\n
,将其替换为空字符串。
希望这有帮助