2016-11-04 82 views
0

我有一個類似於下面XML的文件格式相同hirearchy內有不同的標記名稱的XML文件,邏輯解析使用PHP

<?xml version="1.0" encoding="UTF-8"?> 
<section> 
    <paragraph>val1</paragraph> 
    <list>aa1</list> 
    <list>aa2</list> 
    <list>aa3</list> 
    <paragraph>val2</paragraph> 
    <list>bb1</list> 
    <paragraph>val3</paragraph> 
    <list>cc1</list> 
    <list>cc2</list> 
</section> 

我試圖寫一個PHP代碼打印結果像以下,

val1 - aa1 
val1 - aa2 
val1 - aa3 
val2 - bb1 
val3 - cc1 
val3 - cc2 

我有推導邏輯的問題。有人能幫我解決這個問題嗎?

+0

你的XML有一個非常糟糕的結構l ogic,你可以對它做一些改變,或者你必須使用這種格式?你嘗試過什麼嗎? – Fky

+0

這是我必須使用的格式,我無法更改XML結構... – Nag

+0

您從文件或字符串獲取xml嗎? – Fky

回答

-2

你可以在爆炸後使用正則表達式,比如說$ x是xml。

$y = explode('<paragraph>', $x); 

unset($y[0]); 
foreach($y as $z) 
{ 
    preg_match_all('/(.*)<\/paragraph>?/', $z, $matches); 
    preg_match_all('/<list>(.*)<\/list>/', $z, $matches2); 
} 

$ matches [1]和$ matches2 [1]是你想要的。

0

我認爲最好的解決方案是更改xml結構並使用SimpleXml類。 但是這個代碼會做你想要什麼:https://eval.in/672099

$string =<<<EOF 
<?xml version="1.0" encoding="UTF-8"?> 
<section> 
    <paragraph>val1</paragraph> 
    <list>aa1</list> 
    <list>aa2</list> 
    <list>aa3</list> 
    <paragraph>val2</paragraph> 
    <list>bb1</list> 
    <paragraph>val3</paragraph> 
    <list>cc1</list> 
    <list>cc2</list> 
</section> 
EOF; 

preg_match('#<section>(.*)<\/section>#s', $string, $section); 
preg_match_all('#<paragraph>(.*)<\/paragraph>#sU', $section[1], $paragraph); 
$lists = preg_split('#<paragraph>(.*)<\/paragraph>#sU', $section[1]); 

foreach($paragraph[1] as $key => $p){ 
    $list = null; 
    preg_match_all('#<list>(.*)<\/list>#sU', $lists[$key+1], $list); 
    foreach($list[1] as $l){ 
     echo $p . ' - ' . $l . PHP_EOL; 
    } 
} 

輸出:

val1 - aa1 
val1 - aa2 
val1 - aa3 
val2 - bb1 
val3 - cc1 
val3 - cc2 

編輯

有了一個文件,你可以替換$字符串分配由

$string = file_get_contents("path/to/file.xml");