【问题标题】:Parsing DITA / XML files with text encapsulated nodes in php用php中的文本封装节点解析DITA / XML文件
【发布时间】:2018-03-14 18:08:10
【问题描述】:

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

【问题讨论】:

    标签: php xml parsing xml-parsing dita


    【解决方案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
    "
    

    【讨论】:

    • 太棒了,它做到了:)
    【解决方案2】:

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

    • 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,则将其替换为空字符串。 希望这会有所帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多