Есть ли способ получить файл, содержащий "" 2 раза - PullRequest
0 голосов
/ 23 мая 2018

Я обращаюсь к службе и получаю данные, подобные следующему 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 голосов
/ 23 мая 2018

Нет способа прочитать это напрямую с какой-либо из библиотек обработки 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...