如何在PHP中使用simplexml_load_string来获取没有嵌入标签的innertext?

时间:2016-05-20 14:53:26

标签: php xml simplexml simplexml-load-string

我找到了freely available data dump of USPTO patent data in XML format。大多数专利的部分XML具有以下结构:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE us-patent-grant SYSTEM "us-patent-grant-v45-2014-04-03.dtd" [ ]>
<us-patent-grant lang="EN" dtd-version="v4.5 2014-04-03" file="US09226443-20160105.XML" status="PRODUCTION" id="us-patent-grant" country="US" date-produced="20151221" date-publ="20160105">
  ...
  <claims>
    ...
    <claim id="CLM-00015" num="00015">
      <claim-text>15. The system of <claim-ref idref="CLM-00013">claim 13</claim-ref>, wherein ...</claim-text>
    </claim>
  </claims>
</us-patent-grant>

当我在XML上执行PHP simplexml_load_string函数时,<claim-ref idref="CLM-00013">claim 13</claim-ref>部分消失了,我留下了以下索赔文本:

15. The system of , wherein ...

我尝试执行simplexml_load_string函数,如下所示:

$xml = simplexml_load_string($xmlTxt, 'SimpleXMLElement', LIBXML_NOCDATA);

但它没有改变任何东西 我需要做些什么才能让claim-ref代码中的文字作为CDATA的一部分保留在claim-text代码中?请注意,我不需要保留实际的claim-ref代码,只需保留其中的文字。

1 个答案:

答案 0 :(得分:2)

您的示例XML中没有CDATA部分。 CDATA部分在XML中如下所示:

<foo><![CDATA[<bar>text</bar>]]></foo>

在这种情况下,CDATA部分是单个文本节点。它可以比较:

<foo>&lt;bar&gt;text&lt;/bar&gt;</foo>

如果您需要SimpleXMLElement的文本内容(包括它的后代),您可以将其转换为DOM节点。 DOMElement :: $ textContent属性提供它。

$patentGrant = new SimpleXMLElement($xml);
$node = dom_import_simplexml($patentGrant->claims->claim->{'claim-text'});

var_dump($node->textContent);

输出:

string(39) "15. The system of claim 13, wherein ..."

或者您使用DOMXpath::evaluate(),完全不使用SimpleXML:

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

var_dump($xpath->evaluate('string(/us-patent-grant/claims/claim/claim-text)'));