2

私はxmlとxsdを扱うのが初めてです。Guzzle を使用して Web サービス クライアントを作成しようとしています。

http://guzzlephp.org/index.html

このチュートリアルに従って、非常に基本的なクライアントと 1 つのコマンドを作成できました。

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

私が抱えている問題は、返された XML をより便利な形式に変換する方法です。私が使用している Web サービス (およびそのドキュメントと 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-number (上記の XML の 11 行目) を抽出するにはどうすればよいですか?

私は試した:

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

およびそのバリエーションですが、 $data は常に空の配列です。

4

2 に答える 2

1

XPath では次のことが可能です。

//document-id

document-idDOM 内のどこにあるかに関係なく、すべてのノードを返します。/.../.../.../本当に何かの場所を突き止める必要がない限り、絶対型パスを指定する必要はありません。

于 2012-05-07T13:51:04.680 に答える
1

あなたの問題は、名前空間プレフィックスの使用にかなり関連していると思います。私が (ベスト プラクティスとしても) 行うことは、xpath を記述する前に、独自のプレフィックスと名前空間を登録することです。このようにして、私が制御するプレフィックスを使用します。

PHP には、これを処理する奇妙な (私の意見では) 方法があります。これは、"デフォルト" の方法、つまり、プレフィックスをそれ自体で解決しようとする方法を許可するためです。あなたの場合、このパスのタグはexchange-documents/exchange-document/bibliographic-data/publication-reference/document-id/doc-number実際には修飾されていxmlns="http://www.epo.org/exchange"ます. この名前空間のプレフィックスを登録して、XPath で使用する場合、あなたのものは確実に機能します。

詳細については、このPHP ヘルプ トピックを参照してください。

于 2012-05-07T16:51:43.063 に答える