有没有办法让文件包含“<! - ?xml version ='1.0'? - >”2次

时间:2018-05-23 05:07:26

标签: php xml codeigniter-3

我点击了一项服务,我得到的数据如下面的xml。

<?xml version='1.0'?>
<Properties>
    <Property>  
        <Prop_Class>Residential</Prop_Class>
        <Prop_RefId>Resads -  FHGS - 2034 - 160 - 067546</Prop_RefId>
        <Prop_CompanyGroup>ma</Prop_CompanyGroup>
        <Prop_CompanyName>Propertysvhavs</Prop_CompanyName>
        <Prop_Locality>30</Prop_Locality>
        <Prop_Address1>3 Bedroom houses</Prop_Address1>
        <Prop_Address2></Prop_Address2>
        <Prop_Address3>Clare Road</Prop_Address3>
        <Prop_Address4></Prop_Address4>
        <Prop_Eircode></Prop_Eircode>
        <Prop_Latitude>533.3498</Prop_Latitude >
        <Prop_Longitude>623.260300000000029</Prop_Longitude >
        <Prop_Status>A</Prop_Status> 
        <Prop_SaleOrRent>Sale</Prop_SaleOrRent>    
        <Prop_SaleType>For Sale</Prop_SaleType>         
        <Prop_Type>Residential   Apartment</Prop_Type>               
        <Prop_Bedrooms>1</Prop_Bedrooms>
        <Prop_Bathrooms>3</Prop_Bathrooms>
        <Prop_FullDescription></Prop_FullDescription> 
        <Prop_Price></Prop_Price>
        <Prop_PriceOption>m</Prop_PriceOption> 
        <Prop_ShowPrice>Y</Prop_ShowPrice>
        <Prop_Negotiator>Philip O'Reilly - Test </Prop_Negotiator>                              
        <Prop_EnergyRating>A2</Prop_EnergyRating>
        <Prop_EnergyRatingDetails>A2</Prop_EnergyRatingDetails>
    </Property>
</Properties>
<?xml version='1.0'?>
<Images>
    <Image>
        <Prim_RefId>Resads -  FHGS - 2034 - 160 - 067546</Prim_RefId>
        <Prim_CompanyGroup>ma</Prim_CompanyGroup>
        <Prim_Type>PA</Prim_Type>
        <Prim_Filename>http://www.prhjsgdh.ie/uploads/web/286_3 bed dev.jpg</Prim_Filename>
        <Prim_Status>A</Prim_Status>
        <Prim_Class>Residential</Prim_Class>
    </Image>
    <Image>
        <Prim_RefId>Resads -  FHGS - 2034 - 160 - 067546</Prim_RefId>
        <Prim_CompanyGroup>ma</Prim_CompanyGroup>
        <Prim_Type>PA</Prim_Type>
        <Prim_Filename>http://www.hashjshd.ie/uploads/web/286_3bedsemi-2014.jpg</Prim_Filename>
        <Prim_Status>A</Prim_Status>
        <Prim_Class>Residential</Prim_Class>
    </Image>
    <Image>
        <Prim_RefId>Resads -  FHGS - 2034 - 160 - 067546</Prim_RefId>
        <Prim_CompanyGroup>ma</Prim_CompanyGroup>
        <Prim_Type>PA</Prim_Type>
        <Prim_Filename>http://www.asdbjhsdh.ie/uploads/web/286_3 bed dev.jpg</Prim_Filename>
        <Prim_Status>A</Prim_Status>
        <Prim_Class>Residential</Prim_Class>
    </Image>
</Images>

但此XML包含2 <?xml version='1.0'?>。所以我无法获取文件内容。

有没有办法将文件作为XML? 甚至是将文件拆分为<?xml version='1.0'?>的出现次数的任何方法?

1 个答案:

答案 0 :(得分:2)

没有办法直接使用任何XML处理库来读取它,因为它是一个无效的XML文档。虽然我有两种方法可以做到这一点。

第一个涉及操纵<?xml ?>标记使其成为普通标记并将整个文档包装在公共标记中(在这种情况下为<base>,但这并不重要)。然后你可以正常加载整个文档并提取数据......

$data = str_replace(["<?", "?>"], ["<", "/>"], $data);
$xml = simplexml_load_string("<base>".$data."</base>");
foreach ( $xml->Properties->Property as $property ) {
    echo $property->Prop_RefId.PHP_EOL;
}
echo PHP_EOL;
foreach ( $xml->Images->Image as $image )   {
    echo $image->Prim_RefId.PHP_EOL;
}
echo PHP_EOL;

您需要记住的是,现有结构上方有一个级别,这就是我引用$xml->Properties->Property的原因。

第二种是将文档拆分成它的部分。使用explode()<?xml ?>标记作为分隔符,然后照常处理每个部分。不利的一面是,如果声明发生变化,那么这将失败。这样做的好处是,如果您传递了原始XML文档,它的工作方式也是一样的。

$list = explode("<?xml version='1.0'?>", $data );
$xml = simplexml_load_string ( $list[1] );
foreach ( $xml->Property as $property ) {
    echo $property->Prop_RefId.PHP_EOL;
}
echo PHP_EOL;
$xml = simplexml_load_string ( $list[2] );
foreach ( $xml->Image as $image )   {
     echo $image->Prim_RefId.PHP_EOL;
}
echo PHP_EOL;