Я нашел свободно доступный дамп данных патентных данных USPTO в формате XML. Часть 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>
Когда я выполняю PHP simplexml_load_string
функция на XML, <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. Раздел 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)'));
Других решений пока нет …