我试图解析一个.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个空格,因此单词的位置不会正确。
答案 0 :(得分:1)
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
"
答案 1 :(得分:0)
这可以通过使用正则表达式操作模块导入来解决:
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
返回所需的结果。
该功能将删除所有标签并保留文本。
如果字符串中有\n
,请用空字符串替换。
希望对您有帮助