2011-12-16 10 views
1

XMLで定義された属性を持つサブタグをエクスポート(または保持)したいと思います。私はこのプロセスの名前を知らないので、ネット上で関連する情報を見つけることはできません。説明が難しいので、私は問題の例を挙げることにしました。XMLから定義された要素をエクスポートする

<results> 
    <result idSite="1"> 
     <row> 
      <label>category</label> 
      <visits>2</visits> 
      <idsubdatatable>5</idsubdatatable> 
      <subtable> 
       <row> 
        <label>uncategorized</label> 
        <visits>2</visits> 
        <idsubdatatable>6</idsubdatatable> 
        <subtable> 
         <row> 
          <label>/index</label> 
          <visits>2</visits> 
          <url>http://mysite1.com/category/uncategorized/</url> 
         </row> 
        </subtable> 
       </row> 
      </subtable> 
     </row> 
     <row> 
      <label>about</label> 
      <visits>1</visits> 
      <idsubdatatable>7</idsubdatatable> 
      <subtable> 
       <row> 
        <label>/index</label> 
        <visits>1</visits> 
        <url>http://mysite1.com/about/</url> 
       </row> 
      </subtable> 
     </row> 
    </result> 
    <result idSite="2"> 
     <row> 
      <label>/calendar</label> 
      <visitors>1</visitors> 
      <url>http://mysite2.com/calendar</url> 
     </row> 
    </result> 
</results> 

そして、私は結果を解析し、<url>属性である行だけを維持する必要があります:

は、私は、このXMLファイルを持っている、のは、言ってみましょう。このように:

xml parsing

解析した後、私は新しいXMLファイルにこれらの行を結合する必要があり、最終的な結果は次のようにする必要があります

<result> 
<row> 
    <label>/index</label> 
    <visits>2</visits> 
    <url>http://mysite1.com/category/uncategorized/</url> 
</row> 
<row> 
    <label>/index</label> 
    <visits>1</visits> 
    <url>http://mysite1.com/about/</url> 
</row> 
<row> 
    <label>/calendar</label> 
    <visitors>1</visitors> 
    <url>http://mysite2.com/calendar</url> 
</row> 
</result> 

は、一般的に私はこのプロセスをしたいですPHPが、それはおそらく他の言語でもあります。 この問題を解決する考えがある場合は、コメントしてください。

+2

を*が、属性*要素*(または一般*タグ*)。 * XMLの属性*は別のものです。おそらくそれはあなたの検索に役立ちます。 – hakre

答えて

3

xpathクエリを使用して、行ノード内のすべてのURLノードを検索します。その後、ちょうどあなたがそうのような新しいDomDocumentに見つける各url要素の親ノード追加:*それらが呼び出されない

$xml = '...'; 
$dom = new DomDocument(); 
$dom->preserveWhiteSpace = FALSE; 
$dom->loadXML($xml); 

$new_dom = new DomDocument(); 
$result = $new_dom->createElement('result'); 
$new_dom->appendChild($result); 

$xpath = new DOMXPath($dom); 
$rows = $xpath->query('//row/url'); 

for ($i=0;$i<$rows->length;$i++) { 
    $node = $new_dom->importNode($rows->item($i)->parentNode, TRUE); 
    $result->appendChild($node); 
} 

$new_dom->formatOutput = TRUE; 
echo $new_dom->saveXML(); 
+0

ありがとう:) –

1

私はあなたの入力として読むためにsimplexmlを使用したいので、あなたの解析は簡単です。そして、私のような再帰関数を作成したい:

function isUrlElement($element){ 
    foreach($element->children() as $children){ 
     if($children->getName() == 'url'){ 
      return true; 
     }else{ 
      isUrlElement($children); 
     } 
    } 
} 

さて、これははるかに完全からですが、それはそれぞれの子供たちのためにそれを呼び出す再帰作ることができます。これがtrueを返すと、URLを子として持つノードが見つかりました。その$ elementノードを使って、たとえばsimplexmlelementsの配列に追加してからXMLに戻します。

それは意味がありますか?

関連する問題