Как использовать Simplexml_load_string в PHP, чтобы получить внутренний текст без встроенных тегов?

Я нашел свободно доступный дамп данных патентных данных 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 теги, просто текст внутри них.

1

Решение

Здесь нет раздела CDATA в вашем примере XML. Раздел 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)'));
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]