簡體   English   中英

PHP中的simpleXML從XML文檔中的嵌套名稱空間讀取元素

[英]simpleXML in PHP reading elements from nested namespaces in XML document

我難倒。 我的文件中包含以下XML:

<?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>

在PHP中使用SimpleXML,我有以下代碼:

$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注意:第108行的file.php中未定義的偏移量:0

123街

水牛

紐約:紐約

12345

第105行引用$ rawContactFirstName [0],第108行引用$ rawContactLastName [0]

名字和姓氏在文檔中兩次,並且由於引用globLib命名空間的方式不同,所以我從第一個引用中引用姓氏,從第二個引用中引用姓氏。

我無法使用globLib命名空間從任何元素中獲取任何信息,而且我也不明白為什么。 只要不使用globLib命名空間,我就可以從文檔中獲取其他任何信息。

$ xml-> xpath(); 應該返回一個數組。 考慮以下:

print_r($rawContactFirstName);

輸出: 數組()

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

輸出: array(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");

(或您要使用的任何唯一前綴)。

然后在您的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 都是有效的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM