我找到了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
代码,只需保留其中的文字。
答案 0 :(得分:2)
您的示例XML中没有CDATA部分。 CDATA部分在XML中如下所示:
<foo><![CDATA[<bar>text</bar>]]></foo>
在这种情况下,CDATA部分是单个文本节点。它可以比较:
<foo><bar>text</bar></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)'));