2012-05-07 2 views
2

Я новичок в работе с xml и xsd. Я пытаюсь создать клиент веб-службы с помощью жрать:PHP Web Service Клиенты: Guzzle и xsd

http://guzzlephp.org/index.html

Я был в состоянии создать очень простой клиента и 1 команда после этого урока:

http://guzzlephp.org/tour/building_services.html

Вопрос I есть, как получить возвращенный XML в более полезный формат. Веб-сервис я использую (и его документации и XSD) можно найти здесь:

http://www.epo.org/searching/free/ops.html

Я получаю SimpleXMLElement. Предположим следующее содержание XML:

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type="text/xsl" href="/2.6.2/style/exchange.xsl"?> 
<ops:world-patent-data xmlns:ops="http://ops.epo.org" xmlns="http://www.epo.org/exchange" xmlns:ccd="http://www.epo.org/ccd" xmlns:xlink="http://www.w3.org/1999/xlink"> 
    <ops:meta name="elapsed-time" value="30"/> 
    <exchange-documents> 
     <exchange-document system="ops.epo.org" family-id="19768124" country="EP" doc-number="1000000" kind="A1"> 
      <bibliographic-data> 
       <publication-reference> 
        <document-id document-id-type="docdb"> 
         <country>EP</country> 
         <doc-number>1000000</doc-number> 
         <kind>A1</kind> 
         <date>20000517</date> 
        </document-id> 
        <document-id document-id-type="epodoc"> 
         <doc-number>EP1000000</doc-number> 
         <date>20000517</date> 
        </document-id> 
       </publication-reference> 
       <!-- a lot of content snipped --> 
      </bibliographic-data> 
     </exchange-document>   
    </exchange-documents> 
</ops:world-patent-data> 

Как я могу, как очень простой пример извлечения Doc-номер (в строке 11 XML выше)?

Я пробовал:

$xpath = '/ops:world-patent-data/exchange-documents/exchange-document/bibliographic-data/publication-reference/document-id/doc-number'; 
$data = $result->xpath($xpath); 

и вариации его, но $ данных всегда и пустой массив.

ответ

1

Я считаю, что ваша проблема скорее связана с использованием префиксов пространства имен. То, что я хотел бы сделать (как лучшая практика), - это убедиться, что я зарегистрирую свои собственные префиксы и пространства имен, прежде чем писать свой xpath. Таким образом, я буду использовать префиксы, контролируемые мной.

PHP имеет странный (на мой взгляд) способ справиться с этим, поскольку он позволяет использовать «по умолчанию», т. Е. Пытается самостоятельно решить префиксы. В вашем случае теги на этом пути exchange-documents/exchange-document/bibliographic-data/publication-reference/document-id/doc-number действительно являются квалифицированными, из-за xmlns="http://www.epo.org/exchange". Если вы зарегистрируете префикс для этого пространства имен и используете его в своем XPath, я уверен, что ваши вещи будут работать.

Взгляните на эту PHP help topic, чтобы понять больше об этом ...

+0

по ссылке и добавил: $ result-> registerXPathNamespace ('обмен', 'http://www.epo.org/exchange'); Путь // обмен: библиографические данные/публикация-ссылка/document-id/doc-number не работает, однако просто используйте // exchange: doc-номер, как предлагает Marc B. Я смущен ... EDIT: ok Первый путь должен быть // exchange: bibliographic-data/exchange: publication-reference/exchange: document-id/exchange: doc-number. Имеет смысл теперь, когда я думал об этом, но немного подробней ... –

+0

Вы также должны посмотреть на [Компонент CssSelector Symfony2] (http://symfony.com/doc/current/components/css_selector.html), он создан для создания XPath для вас. Надеюсь это поможет. – renoirb

1

XPath позволяет это:

//document-id 

который будет возвращать все document-id узлы, независимо от того, где они находятся в DOM. Вам не нужно указывать абсолютный путь типа /.../.../.../, если только вам не нужно прибивать что-то.