2011-10-20 20 views
1

<name><URL>タグの値はsubtype="mytype"です。PHPでどのように行うことができますか? 私の結果には、文書名とtest.pdfパスが必要です。特定の属性でPHPのXMLを解析する

<?xml version="1.0" encoding="UTF-8"?> 
    <test> 
     <required> 
      <item type="binary"> 
       <name>The name</name> 
      <url visibility="restricted">c:/temp/test/widget.exe</url> 
      </item> 
      <item type="document" subtype="mytype"> 
       <name>document name</name> 
      <url visiblity="visible">c:/temp/test.pdf</url> 
      </item> 
     </required> 
    </test> 
+0

誰があなたをマークしたのかわからないのですが、なぜフィルが正しいのですか? SimpleXML(XPathを使用して)は行く方法です:http://www.w3schools.com/php/php_xml_simplexml.asp – paulsm4

+0

@ paulsm4:downvoteは私から来ました。その理由は、研究努力が示されておらず、コードが提供されておらず、GoogleまたはSO検索機能によって答えが見つかる可能性があります。 – vstm

+0

XML Parser拡張機能はオプションですか? – Unsigned

答えて

3

使用SimpleXML and XPath、拡張子が5.1.2+例えば

$xml = simplexml_load_file('path/to/file.xml'); 

$items = $xml->xpath('//item[@subtype="mytype"]'); 
foreach ($items as $item) { 
    $name = (string) $item->name; 
    $url = (string) $item->url; 
} 
+0

$ xmlStringとは何ですか? – dayana

+0

それは.xmlファイルパスですか? – dayana

+0

@dayana XMLが文字列変数であると仮定しました。私はファイルを使用するために私の答えを更新しました – Phil

2

PHPはデフォルトで有効になってSimpleXMLと呼ばれます。上記の例のように整形式のXMLを解析するのに非常に便利です。

まず、SimpleXMLElementインスタンスを作成し、XMLをコンストラクタに渡します。 SimpleXMLがXMLを解析します。 (私はSimpleXMLのの優雅さがあると感じここにある - 。のSimpleXMLElementは、ライブラリ全体の唯一のクラスである)今

$xml = new SimpleXMLElement($yourXml); 

、それは任意のPHPオブジェクトであるかのように、あなたは簡単にXMLを通過することができます。属性は配列値としてアクセスできます。 codepadに正しいことを確認済み

<?php 
$yourXml = <<<END 
<?xml version="1.0" encoding="UTF-8"?> 
    <test> 
     <required> 
      <item type="binary"> 
       <name>The name</name> 
      <url visibility="restricted">c:/temp/test/widget.exe</url> 
      </item> 
      <item type="document" subtype="mytype"> 
       <name>document name</name> 
      <url visiblity="visible">c:/temp/test.pdf</url> 
      </item> 
     </required> 
    </test> 
END; 

// Create the SimpleXMLElement 
$xml = new SimpleXMLElement($yourXml); 

// Store an array of results, matching names to URLs. 
$results = array(); 

// Loop through all of the tests 
foreach ($xml->required[0]->item as $item) { 
    if (! isset($item['subtype']) || $item['subtype'] != 'mytype') { 
     // Skip this one. 
     continue; 
    } 

    // Cast, because all of the stuff in the SimpleXMLElement is a SimpleXMLElement. 
    $results[(string)$item->name] = (string)$item->url; 
} 

print_r($results); 

:あなたは、特定の属性値を持つタグを探しているので、我々は、XMLを通過する単純なループを書くことができます。

希望すると便利です。

0

XMLパーサーまたはSimpleXMLを使用できます。