0

フィールド名と値でドキュメントを区別するxmlコンテンツを表示したいのですが、助けてください..以下は私のxmlファイルコンテンツです..

<doc>
    <field name="id">1</field>
    <field name="name">A</field>
    <field name="sk">Acce</field>
    <field name="level">Beginner</field>
    <field name="do">Tuto</field>
    <field name="open">1</field>
    <field name="type">Ct</field>
    <field name="extensis">cl_ex</field>
    <field name="features">Atos</field>
    <field name="downl"></field>
    <field name="source">AtomicCounters</field>
    <field name="description">Ths.</field>
    <field name="tag1"></field>
    <field name="tag2"></field>
    <field name="tag3"></field>
    <field name="tag4">Global</field>
    <field name="tag5">Atomic</field>
    <field name="tag6"></field>
    <field name="tag7"></field>
    <field name="tag8"></field>
    <field name="tag9"></field>
    <field name="tag10"></field>
  </doc>

  <doc>
    <field name="id">2</field>
    <field name="name">Ar</field>
    <field name="sk">Acrce</field>
    <field name="level">Beginner</field>
    <field name="do">Tuto1</field>
    <field name="open">11</field>
    <field name="type">C1t</field>
    <field name="extensis">cl_exd</field>
    <field name="features">Atos</field>
    <field name="downl"></field>
    <field name="source">ddddd</field>
    <field name="description">Thsdd.</field>
    <field name="tag1"></field>
    <field name="tag2"></field>
    <field name="tag3"></field>
    <field name="tag4">Global1</field>
    <field name="tag5">Atomic1</field>
    <field name="tag6"></field>
    <field name="tag7"></field>
    <field name="tag8"></field>
    <field name="tag9"></field>
    <field name="tag10"></field>
  </doc>

以下は私が使用しているコードです..

 <?php
    $result="";
    $document = new DOMDocument();
    //$document->load('/wamp/www/amd/261013/test/amd_one.xml');
    $document->load('http://localhost/solr/select');



    // this will also output doctype and comments at top level
    foreach($document->childNodes as $node)
       $result[] .= $document->saveXML($node)."\n";

    //echo $result[];

    foreach($result as $key => $value)
    {
      echo "$key - $value<br/>";
    }

    ?>

ただし、値のみです... 1 Ar Acceのように....

$field = id、$value = 1、$field = name、$value = A、$field = id、$value = 2、$field = name、$value = Ar、..

任意の提案をしてください..

4

2 に答える 2

0

これは と についてkeyではなく、 -nodevaluename-attribute<field>とその値についてです。

使用例simplexml

$xml = simplexml_load_string($x); // assume XML in $x

foreach ($xml->doc as $doc) {
    foreach ($doc->field as $field) echo "$field[name]: $field <br />";
    echo "------ <br />";
}

動作を確認してください: http://codepad.viper-7.com/k3zg8I

于 2013-10-26T15:09:26.570 に答える
0

コードに問題があります。まず第一に、実際に に変換する必要はありません (変換することはできますが、開始するためには必要最小限のことしか行いません)。また、あなたが知らなかったと思われる点がいくつかあるので、コードに関するいくつかの指針を以下に示します。

あなたが書く:

foreach ($document->childNodes as $node)

しかし、実際には、<doc>これまで要素にしか興味がありませんでした。これをやろう:

foreach ($document->getElementsByTagName('doc') as $node)

このバリアントは、実際には、<doc>興味のある要素のみを提供します$node

次に、次の問題は、<field>(私の答えでは と呼ばれる<str>)要素をname属性とノード値とともに$key => $valueペアに変換することです。変換をより流暢に適用できるように、マッピング機能を少し補助することでこれを行うのが最善だと思います。そのようなマッピング関数を作成しましょう:

$keyValue = function (DOMElement $element)
{
    return [
        $element->getAttribute('name'), // key
        trim($element->nodeValue),      // value
    ];
};

DOMElementこれは、オブジェクトを最初のエントリとしてのキー (属性nameを読み取ることにより) と 2 番目のエントリとしての値 (ノード値を読み取ることにより)を持つ配列に変換する小さな関数です。かなりシンプルな機能です。

この関数は、要素のループ内およびすべての子要素$docsのさらに下に適用できるようになりました。<str>

foreach ($document->getElementsByTagName('doc') as $node)
{
    foreach ($node->getElementsByTagName('str') as $field)
    {
        list($key, $value) = $keyValue($field);
        echo "\$key: $key - \$value: $value\n";
    }
}

このチャンクが示すように、要素を反復処理した後、質問で( )<doc>という名前の各子孫要素を反復処理します。これらのそれぞれにマッピング関数が適用され、マッピング関数の戻り値から変数と変数を取得します。<str><field>$keyValue()$key$value

注: 子ノードのトラバーサルをより具体的にする必要がある場合は、PHP DOMDocument のフィルター処理された子ノードのトラバーサルを参照してくださいDOMNodeList

サンプルを実行して、動作するかどうかをテストしましょう。

1. Node:
========
$key: id - $value: 3
$key: name - $value: BinarySearch
$key: sdk - $value: Accelerated Parallel Process
$key: level - $value: Beginner
$key: domain - $value: 
...
2. Node:
========
$key: id - $value: 2
$key: name - $value: BasicDebug
$key: sdk - $value: Accelerated Parallel Process
$key: level - $value: Beginner
$key: domain - $value: Debug
...
3. Node:
========
$key: id - $value: 1
$key: name - $value: AtomicCounters
$key: sdk - $value: Accelerated Parallel Process
$key: level - $value: Beginner
$key: domain - $value: Tutorial
...
4. Node:
========
$key: id - $value: 4
$key: name - $value: BinomialOption
$key: sdk - $value: Accelerated Parallel Process
$key: level - $value: Beginner
$key: domain - $value: Financial Engineering
...
5. Node:
========
$key: id - $value: 5
$key: name - $value: BinomialOptionMultiGPU
$key: sdk - $value: Accelerated Parallel Process
$key: level - $value: Intermediate
$key: domain - $value: Financial Engineering
...
6. Node:
========
$key: id - $value: 6
$key: name - $value: BitonicSort
$key: sdk - $value: Accelerated Parallel Process
$key: level - $value: Beginner
$key: domain - $value: General
...
7. Node:
========
$key: id - $value: 7
$key: name - $value: BlackScholes
$key: sdk - $value: Accelerated Parallel Process
$key: level - $value: Intermediate
$key: domain - $value: Financial Engineering
...
8. Node:
========
$key: id - $value: 8
$key: name - $value: BlackScholesDP
$key: sdk - $value: Accelerated Parallel Process
$key: level - $value: Intermediate
$key: domain - $value: Financial Engineering
...
9. Node:
========
$key: id - $value: 9
$key: name - $value: BoxFilter
$key: sdk - $value: Accelerated Parallel Process
$key: level - $value: Intermediate
$key: domain - $value: Image Processing
...
10. Node:
========
$key: id - $value: 10
$key: name - $value: BoxFilterGL
$key: sdk - $value: Accelerated Parallel Process
$key: level - $value: Intermediate
$key: domain - $value: Image Processing
...

そして、これはあなたが探していた結果のように見えます。その例で使用されている正確なコードは次のとおりです。

<?php
/**
 * How to display value with field names from Solr XML files, getting values only
 *
 * @link https://stackoverflow.com/q/19605287/367456
 */

$file = "solr.xml";

if (!file_exists($file))
{
    $url    = 'http://index.websolr.com/solr/15b84f04a7e/select';
    $handle = fopen($url, 'r');
    file_put_contents($file, $handle);
    fclose($handle);
}

$document = new DOMDocument();
$document->load($file);

$keyValue = function (DOMElement $element)
{
    return [
        $element->getAttribute('name'), // key
        trim($element->nodeValue), // value
    ];
};


foreach ($document->getElementsByTagName('doc') as $node)
{
    foreach ($node->getElementsByTagName('str') as $field)
    {
        list($key, $value) = $keyValue($field);
        echo "\$key: $key - \$value: $value\n";
    }
}


foreach ($document->getElementsByTagName('doc') as $index => $node)
{
    printf("%d. Node:\n========\n", $index + 1);
    foreach ($node->getElementsByTagName('str') as $count => $field)
    {
        if ($count > 4)
        {
            echo "...\n";
            break;
        }

        list($key, $value) = $keyValue($field);
        echo "\$key: $key - \$value: $value\n";
    }
}
于 2013-10-26T19:17:17.703 に答える