2012-05-01 7 views
0

私は困惑しています。私は、ファイルに次のXMLがありますXML文書内のネストされた名前空間から要素を読み取るPHPのsimpleXML

PHPでのSimpleXMLを使用
<?xml version="1.0" encoding="UTF-8"?> 
<grant:GrantApplication xmlns:grant="http://apply.grants.gov/system/MetaGrantApplication" xmlns:globLib="http://apply.grants.gov/system/GlobalLibrary-V1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://apply.grants.gov/system/MetaGrantApplication http://apply07.grants.gov/apply/opportunities/schemas/agency/oppEPA-R5-GL2011-1-cfda66.469.xsd"> 
    <grant:Forms> 
     <EPA_KeyContacts:KeyContactPersons xmlns:EPA_KeyContacts="http://apply.grants.gov/forms/EPA_KeyContacts-V1.1" EPA_KeyContacts:FormVersion="1.1"> 
      <EPA_KeyContacts:AuthorizedRepresentative> 
       <globLib:Name xmlns:globLib="http://apply.grants.gov/system/GlobalLibrary-V2.0"> 
        <globLib:FirstName>Jane</globLib:FirstName> 
        <globLib:LastName>Doe</globLib:LastName> 
       </globLib:Name> 
      </EPA_KeyContacts:AuthorizedRepresentative> 
     </EPA_KeyContacts:KeyContactPersons> 
     <EPA4700_4_2_0:EPA4700_4_2_0 xmlns:EPA4700_4_2_0="http://apply.grants.gov/forms/EPA4700_4_2_0-V2.0" EPA4700_4_2_0:FormVersion="2.0"> 
      <EPA4700_4_2_0:ApplicantInfo> 
       <EPA4700_4_2_0:ApplicantName>ABC 123</EPA4700_4_2_0:ApplicantName> 
       <EPA4700_4_2_0:ApplicantAddress> 
        <EPA4700_4_2_0:Address>123 Street</EPA4700_4_2_0:Address> 
        <EPA4700_4_2_0:City>Buffalo</EPA4700_4_2_0:City> 
        <EPA4700_4_2_0:State>NY: New York</EPA4700_4_2_0:State> 
        <EPA4700_4_2_0:ZipCode>12345</EPA4700_4_2_0:ZipCode> 
       </EPA4700_4_2_0:ApplicantAddress> 
      <EPA4700_4_2_0:ApplicantInfo> 
     <EPA4700_4_2_0:EPA4700_4_2_0 xmlns:EPA4700_4_2_0="http://apply.grants.gov/forms/EPA4700_4_2_0-V2.0" EPA4700_4_2_0:FormVersion="2.0"> 
     <SF424_2_1:SF424_2_1 xmlns:SF424_2_1="http://apply.grants.gov/forms/SF424_2_1-V2.1" SF424_2_1:FormVersion="2.1"> 
      <SF424_2_1:ContactPerson> 
       <globLib:FirstName xmlns:globLib="http://apply.grants.gov/system/GlobalLibrary-V2.0">Jane</globLib:FirstName> 
       <globLib:LastName xmlns:globLib="http://apply.grants.gov/system/GlobalLibrary-V2.0">Doe</globLib:LastName> 
      <SF424_2_1:ContactPerson> 
     <SF424_2_1:SF424_2_1> 
    </grant:Forms> 
</grant:GrantApplication> 

を、私は次のコードを持っている:

$xml = simplexml_load_file($appdir); 

$xml->registerXPathNamespace("grant","http://apply.grants.gov/system/MetaGrantApplication"); 
$xml->registerXPathNamespace("header","http://apply.grants.gov/system/Header-V1.0"); 
$xml->registerXPathNamespace("globLib","http://apply.grants.gov/system/GlobalLibrary-V2.0"); 
$xml->registerXPathNamespace("EPA_KeyContacts","http://apply.grants.gov/forms/EPA_KeyContacts-V1.1"); 
$xml->registerXPathNamespace("SF424A","http://apply.grants.gov/forms/SF424A-V1.0"); 
$xml->registerXPathNamespace("SF424_2_1","http://apply.grants.gov/forms/SF424_2_1-V2.1"); 
$xml->registerXPathNamespace("EPA4700_4_2_0","http://apply.grants.gov/forms/EPA4700_4_2_0-V2.0"); 

$rawContactFirstName = $xml->xpath("/grant:GrantApplication/grant:Forms/SF424_2_1:SF424_2_1/SF424_2_1:ContactPerson/globLib:FirstName"); 
$contactFirstName = $rawContactFirstName[0]; 

$rawContactLastName = $xml->xpath("/grant:GrantApplication/grant:Forms/EPA_KeyContacts:KeyContactPersons/EPA_KeyContacts:AuthorizedRepresentative/globLib:Name/globLib:LastName"); 
$contactLastName = $rawContactLastName[0]; 

$rawStreetAddress = $xml->xpath("/grant:GrantApplication/grant:Forms/EPA4700_4_2_0:EPA4700_4_2_0/EPA4700_4_2_0:ApplicantInfo/EPA4700_4_2_0:ApplicantAddress/EPA4700_4_2_0:Address"); 
$streetAddress = $rawStreetAddress[0]; 

$rawCity = $xml->xpath("/grant:GrantApplication/grant:Forms/EPA4700_4_2_0:EPA4700_4_2_0/EPA4700_4_2_0:ApplicantInfo/EPA4700_4_2_0:ApplicantAddress/EPA4700_4_2_0:City"); 
$city = $rawCity[0]; 

$rawState = $xml->xpath("/grant:GrantApplication/grant:Forms/EPA4700_4_2_0:EPA4700_4_2_0/EPA4700_4_2_0:ApplicantInfo/EPA4700_4_2_0:ApplicantAddress/EPA4700_4_2_0:State"); 
$state = $rawState[0]; 

$rawZip = $xml->xpath("/grant:GrantApplication/grant:Forms/EPA4700_4_2_0:EPA4700_4_2_0/EPA4700_4_2_0:ApplicantInfo/EPA4700_4_2_0:ApplicantAddress/EPA4700_4_2_0:ZipCode"); 
$zip = $rawZip[0]; 

echo $contactFirstName."<br>". 
    $contactLastName."<br>". 
    $streetAddress."<br>". 
    $city."<br>". 
    $state."<br>". 
    $zip."<br>"; 

を私は次のような出力が得られます。

お知らせ:オフセット未定義します:行105のfile.phpの0 Notice:Undefined 行108のfile.phpのオフセット:0

123ストリート

バッファロー

NY:ニューヨーク

ライン105参照$ rawContactFirstName [0]とライン108参照$ rawContactLastName [0]

姓名はglobLib名前空間が参照される方法の違いによって、2番目のオカレンスから最初のオカレンスとファーストネームから姓を参照しています。

globLib名前空間を使用している要素から情報を得ることができず、その理由を理解できません。 globLib名前空間を使用していない限り、ドキュメントから他の情報を得ることができます。

$ xml-> xpath();配列を返す必要があります。次のことを考えてみましょう:

print_r($rawContactFirstName); 

出力: アレイ()

var_dump($rawContactFirstName); 
var_dump($rawContactFirstName[0]); 

出力: 配列(0){}

私はどのようにすべてを理解していません他の名前空間は、まったく同じ手法を使用してこの名前空間以外のデータを返すことができます。 http://validator.w3.org/によれば、XML文書は有効である。

アイデア?

$xml->registerXPathNamespace("globLib","http://apply.grants.gov/system/GlobalLibrary-V2.0"); 

$xml->registerXPathNamespace("globLib2","http://apply.grants.gov/system/GlobalLibrary-V2.0"); 

(またはユニークどんな接頭あなたが使用したい)

答えて

0

は、この行を変更してみてください。その後、

そして、あなたのXPathでそのようにそれを参照:

$rawContactFirstName = $xml->xpath("/grant:GrantApplication/grant:Forms/SF424_2_1:SF424_2_1/SF424_2_1:ContactPerson/globLib2:FirstName"); 

私は何が起こっていることは、接頭辞「globLibは」すでに文書要素に異なるURIに登録されていることということだと思うし、それは何とかregisterXPathNamespaceを混乱さです。

あなたが投稿したXMLは有効ではないようです。開かれたタグで閉じられている閉じられていないタグとタグがたくさんあるので、を使用しているXMLはすべてが有効であることを絶対に確信します。

+0

ちょっとライアン、この質問を投稿した直後に、プレフィックスを変更しました。 globLib接頭辞はすでに登録されており、競合が発生しています。あなたの答えをありがとう、私は遅れてお詫び申し上げます。 –

関連する問題