0

以下の XML の特定の場所の末尾にデータを追加しようとしています。

私の XML はもっと長いのですが、たとえば、"Delete" というラベルの付いたセクションの最後に Data を追加したいと考えています。次に、「Total Tickets」の最後に別のデータを追加しますが、最初の子の最後にデータを追加する方法をどうにかして理解できれば、残りを理解できます。

<report>
<sets>
<set>
  <legend>Delete</legend>
  <values>
    <value date="2012-06-24" data="9"/>
    <value date="2012-06-25" data="17"/>
    <value date="2012-06-26" data="15"/>
    <value date="2012-06-27" data="10"/>
    <value date="2012-06-28" data="8"/>
  </values>
</set>
   <set>
  <legend>Total Tickets</legend>
  <values>
    <value date="2012-06-24" data="412"/>
    <value date="2012-06-25" data="416"/>
    <value date="2012-06-26" data="423"/>
    <value date="2012-06-27" data="405"/>
    <value date="2012-06-28" data="280"/>
  </values>
</set>
</sets>
</report>

以下は、結果を確認するために作成したテスト スクリプトです。この例では、凡例「削除」のリストの最後に「12345」の属性データを持つ要素「値」を追加しようとしています。

<?php

$doc = new DOMDocument;

$doc->load('result.xml');

$test = $doc->getElementsByTagName("legend")->item(0);

echo $test->nodeValue.PHP_EOL; //should print Delete

if("Delete" == $test->nodeValue)
{

    $newElement = $doc->createElement('value');
    $theAttribute = $doc->createAttribute('date');

    $theAttribute->value='12345';

    $newElement->appendChild($theAttribute);

    $doc->appendChild($newElement);

}


echo $doc->saveXML();
?>

私が得る結果はこれです:

<report>
<sets>
<set>
  <legend>Delete</legend>
  <values>
    <value date="2012-06-24" data="9"/>
    <value date="2012-06-25" data="17"/>
    <value date="2012-06-26" data="15"/>
    <value date="2012-06-27" data="10"/>
    <value date="2012-06-28" data="8"/>
  </values>
</set>
   <set>
  <legend>Total Tickets</legend>
  <values>

    <value date="2012-06-24" data="412"/>
    <value date="2012-06-25" data="416"/>
    <value date="2012-06-26" data="423"/>
    <value date="2012-06-27" data="405"/>
    <value date="2012-06-28" data="280"/>
  </values>
</set>
</sets>
</report>
<value date="12345"/>

代わりに、次のように表示されるデータを取得しようとしています:

<report>
<sets>
<set>
  <legend>Delete</legend>
  <values>
    <value date="2012-06-24" data="9"/>
    <value date="2012-06-25" data="17"/>
    <value date="2012-06-26" data="15"/>
    <value date="2012-06-27" data="10"/>
    <value date="2012-06-28" data="8"/>
    <value date="12345"/>
  </values>
</set>

XML の最後ではなく、特定の場所にデータを追加する方法がわかりません。

誰でもこれを手伝ってくれてありがとう。

4

1 に答える 1

0

これを試して:

元の XML ファイル (「testFile.xml」として保存):

<?xml version="1.0" encoding="utf-8"?>
<report>
    <sets>
        <set>
            <legend>Delete</legend>
            <values>
                <value date="2012-06-24" data="9"/>
                <value date="2012-06-25" data="17"/>
                <value date="2012-06-26" data="15"/>
                <value date="2012-06-27" data="10"/>
                <value date="2012-06-28" data="8"/>
            </values>
        </set>
        <set>
            <legend>Total Tickets</legend>
            <values>
                <value date="2012-06-24" data="412"/>
                <value date="2012-06-25" data="416"/>
                <value date="2012-06-26" data="423"/>
                <value date="2012-06-27" data="405"/>
                <value date="2012-06-28" data="280"/>
            </values>
        </set>
    </sets>
</report>

PHP コード:

<?php
$dom = new DomDocument( '1.0' );
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;

// load the xml file
$dom->load( 'testFile.xml', LIBXML_NOBLANKS );
$xpath = new DOMXPath($dom);

// prepare the xpath query to find the "values" node corresponding the
// "Delete" legend
$nodes = $xpath->query("//set[legend='Delete']/values");

// if found, append the new "value" node
if( $nodes->length ) {
    $vNode = $dom->createElement( 'value' );
    $vNodeAttr = $dom->createAttribute( 'date' );
    $vNodeAttr->value = '12345';

    $vNode->appendChild($vNodeAttr);

    // append to "values"
    $nodes->item(0)->appendChild( $vNode );
}

// i'm not saving it, just echo'ing
header( 'content-type: text/xml' );
echo $dom->saveXML();
?>

最終的な XML ファイル:

<?xml version="1.0" encoding="utf-8"?>
<report>
  <sets>
    <set>
      <legend>Delete</legend>
      <values>
        <value date="2012-06-24" data="9"/>
        <value date="2012-06-25" data="17"/>
        <value date="2012-06-26" data="15"/>
        <value date="2012-06-27" data="10"/>
        <value date="2012-06-28" data="8"/>
        <!--Node appended here-->
        <value date="12345"/>
      </values>
    </set>
    <set>
      <legend>Total Tickets</legend>
      <values>
        <value date="2012-06-24" data="412"/>
        <value date="2012-06-25" data="416"/>
        <value date="2012-06-26" data="423"/>
        <value date="2012-06-27" data="405"/>
        <value date="2012-06-28" data="280"/>
      </values>
    </set>
  </sets>
</report>

お役に立てれば。

于 2012-07-16T06:30:32.860 に答える