如何在PHP中使用simplexml_load_string获取没有嵌入标签的innertext?
How to use simplexml_load_string in PHP to get innertext without embedded tags?
我找到了 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
标签,只需要保留其中的文本。
您的示例中没有 CDATA 部分 XML。 XML:
中的 CDATA 部分如下所示
<foo><![CDATA[<bar>text</bar>]]></foo>
在这种情况下,CDATA 部分是单个文本节点。它相当于:
<foo><bar>text</bar></foo>
如果您需要简单XML元素(包括它的后代)的文本内容,您可以将其转换为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)'));
我找到了 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
标签,只需要保留其中的文本。
您的示例中没有 CDATA 部分 XML。 XML:
中的 CDATA 部分如下所示<foo><![CDATA[<bar>text</bar>]]></foo>
在这种情况下,CDATA 部分是单个文本节点。它相当于:
<foo><bar>text</bar></foo>
如果您需要简单XML元素(包括它的后代)的文本内容,您可以将其转换为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)'));