2017-02-15 77 views
0

我有幾個XML文件,並希望得到每個產品的兩個值。我可以這樣做:同時通過標籤名稱獲取兩個值?

$doc = simplexml_import_dom($dom); 
$items = $doc->xpath("//$tagName"); 

$titles = array(); 
$prices = array(); 

foreach ($items as $item) { 
    $node = dom_import_simplexml($item); 

    if(strcasecmp($tagName, "title") == 0){ 
     array_push($titles, $node->textContent); 
    } 

    if(strcasecmp($tagName, "price") == 0){ 
     array_push($prices, $node->textContent); 
    } 
} 

但這種方式太不穩定了,我想。我想保證兩個值都是一對。因爲它可能是一種產品不包含價格或標題,這是不可想象的,但它可能是! (該文件不是從我

那麼,有沒有辦法讓每個product的標籤namepreis在同一時間,作爲對 - !?因爲這是安全的唯一途徑

!問候和感謝!

回答

1

是的,這是。您將DOM轉換爲SimpleXML以使用Xpath。這不是必需的。 DOM具有DOMXpath類,而DOMXpath::evaluate()更強大,然後SimpleXMLElement::xpath()

Xpath可以做很多事情。例如,你可以取一個具有namepreis任何產品:

//product[normalize-string(name) != '' and normalize-string(preis) != '']

但要獲得連接,你需要獲取和迭代product節點,然後執行額外的XPath表達式取值的值。

$document = new DOMDocument(); 
$document->loadXml($xml); 
$xpath = new DOMXpath($document); 

$result = []; 
foreach ($xpath->evaluate('//product') as $product) { 
    $result[] = [ 
    'title' => $xpath->evaluate('string(name)', $product), 
    'price' => $xpath->evaluate('number(preis)', $product) 
    ]; 
} 

var_dump($result); 

輸出:

array(5) { 
    [0]=> 
    array(2) { 
    ["title"]=> 
    string(13) "Battlefield 1" 
    ["price"]=> 
    float(80) 
    } 
    [1]=> 
    array(2) { 
    ["title"]=> 
    string(13) "Battlefield 2" 
    ["price"]=> 
    float(180) 
    } 
    ... 

string(name)獲取所有name子節點,並把結果轉換成字符串。在Xpath中,這意味着返回列表中第一個節點的文本內容。如果列表爲空,則會得到一個空字符串。

number(preis)提取所有preis子節點並將第一個節點的文本內容轉換爲數字。如果這裏沒有匹配節點,結果將是0

1

一個建議是使用DOM而不是simplexml。我覺得這是更富有表現力。

---後來編輯---

這裏的simplexml的實施

$string = <<<EOS 
<?xml version='1.0' encoding='UTF-8'?> 
<products> 
    <product> 
    <name>Battlefield 1</name> 
    <preis>80</preis> 
    <sterne>3</sterne> 
    <desc>Dies ist ein Text</desc> 
    <link>https://www.google.de/</link> 
    </product> 
    <product> 
    <name>Battlefield 2</name> 
    <preis>180</preis> 
    <sterne>3</sterne> 
    <desc>Dies ist ein Text</desc> 
    <link>https://www.google.de/</link> 
    </product> 
    <product> 
    <name>Battlefield 3</name> 
    <preis>280</preis> 
    <sterne>3</sterne> 
    <desc>Dies ist ein Text</desc> 
    <link>https://www.google.de/</link> 
    </product> 
    <product> 
    <name>Battlefield 4</name> 
    <preis>380</preis> 
    <sterne>3</sterne> 
    <desc>Dies ist ein Text</desc> 
    <link>https://www.google.de/</link> 
    </product> 
    <product> 
    <name>Battlefield 5</name> 
    <preis>480</preis> 
    <sterne>3</sterne> 
    <desc>Dies ist ein Text</desc> 
    <link>https://www.google.de/</link> 
    </product> 
</products> 
EOS; 

$doc = simplexml_load_string($string); 

// get a list of products 
$products = $doc->xpath('/products/product'); 

// iterate of the list 
foreach ($products as $product) { 
    $name = $product->name->__toString(); 
    $price = $product->preis->__toString(); 

    echo $name . ' = ' . $price . PHP_EOL; 
} 

---後來編輯的結束---

下面是一個工作示例:

<?php 

$string = <<<EOS 
<?xml version='1.0' encoding='UTF-8'?> 
<products> 
    <product> 
    <name>Battlefield 1</name> 
    <preis>80</preis> 
    <sterne>3</sterne> 
    <desc>Dies ist ein Text</desc> 
    <link>https://www.google.de/</link> 
    </product> 
    <product> 
    <name>Battlefield 2</name> 
    <preis>180</preis> 
    <sterne>3</sterne> 
    <desc>Dies ist ein Text</desc> 
    <link>https://www.google.de/</link> 
    </product> 
    <product> 
    <name>Battlefield 3</name> 
    <preis>280</preis> 
    <sterne>3</sterne> 
    <desc>Dies ist ein Text</desc> 
    <link>https://www.google.de/</link> 
    </product> 
    <product> 
    <name>Battlefield 4</name> 
    <preis>380</preis> 
    <sterne>3</sterne> 
    <desc>Dies ist ein Text</desc> 
    <link>https://www.google.de/</link> 
    </product> 
    <product> 
    <name>Battlefield 5</name> 
    <preis>480</preis> 
    <sterne>3</sterne> 
    <desc>Dies ist ein Text</desc> 
    <link>https://www.google.de/</link> 
    </product> 
</products> 
EOS; 

$doc = new DOMDocument(); 
$doc->loadXml($string); 
$products = $doc->getElementsByTagName('product'); 

$index = 0; 
foreach ($products as $product) { 
    echo 'Showing information for product #' . $index++ . PHP_EOL; 
    foreach ($product->childNodes as $property) { 
     if ($property instanceof DOMText) continue; 
     echo ' ->' . $property->localName . ' = ' . $property->textContent . PHP_EOL; 
    } 
} 

讓我知道你是否需要一個simplexml

+0

如果你能給我一個simplexml,我會非常感激。 但是除此之外,你能否解釋你如何得到價格和名稱? - 因爲'$ property-> localName'和'$ property-> textContent'不是名字,不是價格? – Jan

+0

我已經更新了答案。你現在有一個simplexml的例子 – motanelu