使用php

时间:2018-03-14 18:08:10

标签: php xml parsing xml-parsing dita

我试图解析一个.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个空格,因此单词的位置不会正确。

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,请用空字符串替换。 希望对您有帮助