ある場所からテキスト ノードをコピーし、別の場所にあるテキスト ノードに貼り付けたい XML ファイルがあります。
以下は、操作したいXMLファイルです。
<?xml version="1.0" encoding="UTF-8"?>
<Main>
<installObj uniqueObjects="2822">
<object class="Installer" ">
<visualChildren>
<object class="InstallSet">
<installchildrenMain>
<object class="InstallBundle1">
<property name="ruleExpression">
<string><!***[CDATA[I Need a VALUE!]]***>
</string>
</property>
<property name="bundleName">
<string><![CDATA[Australia]]></string>
</property>
<rules logicalOperation="AND">
<object class="CompareVariable">
**
<property name="ruleId">
<string><!***[CDATA[CIAV819]]***>
</string>
</property>
**
</object>
</rules>
<installChildren>
<object class="InstallComponent1">
<property name="ruleExpression">
<string><!***[CDATA[CIAV962***]]>
</string>
</property>
<property name="componentName">
<string><![CDATA[AUST]]></string>
</property>
<rules logicalOperation="AND">
<object class="CompareVariable">
<property name="ruleId">
<string><!***[CDATA[CIAV962]***]>
</string>
</property>
</object>
</rules>
<installChildren>
<object class="InstallDirCont">
<property name="ruleExpression">
<string><![***CDATA[CIAV100 || CIAV503]***]>
</string>
</property>
<rules logicalOperation="OR">
<object class="CompareVariable1">
<property name="ruleId">
<string><***![CDATA[CIAV100]***]></string>
</property>
</object>
<object class="CompareVariable2">
<property name="ruleId">
<string><***![CDATA[CIAV503]***]></string>
</property>
</object>
</rules>
</object>
</installChildren>
</object>
#end of installComponent1
<object class="InstallComponent2">
======
Same as above (Install Component1)
=====
</object>
#end of installComponent2
</installchildren>
</object>
#installBundle1
<object class="InstallBundle2">
====
Same structure as InstallBundle1
====
</object>
#installBundle2
</installchildrenMain>
</object>
# End of InstallSet
</visualChildren>
# end of visualchildren
</object>
# end of Installer
</installObj>
<restorationObjects count="0" />
</Main>
ここでやりたいことは次のとおりです。
オブジェクト クラス InstallBundle1 - オブジェクト クラス CompareVariable から "CIAV819" テキスト ノード値をコピーし、InstallChildrenMain の直前のオブジェクト クラス InstallBundle1 のテキスト ノードに貼り付けます。
オブジェクト クラス InstallComponent1 - オブジェクト クラス CompareVariable から "CIAV962" テキスト ノード値をコピーし、InstallChildren の直前のオブジェクト クラス InstallComponent1 のテキスト ノードに貼り付けます。
オブジェクト クラス InstallDirCont - オブジェクト クラス CompareVariable1 から "CIAV100" テキスト ノード値をコピーし、オペランド "||" を追加します。また、オブジェクト クラス InstallDirCont - オブジェクト クラス CompareVariable2 から "CIAV503" テキスト ノード値をコピーし、InstallChildren の直前のオブジェクト クラス InstallDirCont のテキスト ノードに貼り付けます。
これは少し面倒に見えますが、この修正が必要です。私はxmlとPHPにまったく慣れていません。助けてくれてありがとう。
また、以下は、この xml ファイルを操作するためにここで使用している PHP コードです。
<?php
$xmldoc = new DOMDocument();
$xmldoc ->load('HR92_latest.iap_xml');
#$x = $xmldoc->getElementsByTagName('/InstallAnywhere_Deployment_Project/installationObjects[1]/object[1]/visualChildren[1]/object[1]/installChildren[1]/object[1]/rules[1]/object[1]/property[8]');
$x = $xmldoc->getElementsByTagName('//property[@name]');
var_dump ($x);
foreach ($x as $string) {
echo $string->nodeValue, PHP_EOL;
}
?>
しかし、このコードは o/p を返しています:
object(DOMNodeList)#2 (1) { ["length"]=> int(0) }
基本的に、ここで最初に xpath を見つけ、次にテキスト ノードの値を見つけようとしていますが、失敗しています。どんな助けでも大歓迎です。ありがとう!
2013 年 10 月 17 日 - 更新された質問
@hielsnoppe : DOMDocument の使用に関する制限を見つけています。したがって、xslt コードを使用することを考えました。そして、ほとんど機能しましたが、コマンド プロンプトで実行すると、次のような出力が表示されます。
<object class="InstallComponent1" objectID="03fe9">
<property><string>CIAV4</string></property>
<property name="componentName">
<string>BA, NT db2</string>
</property>
<rules logicalOperation="AND">
<object class="CompareVariable" objectID="0304">
<property name="ruleId">
<string>CIAV4</string>
</property>
</object>
</rules>
<installChildren>
<object class="InstallDirCont" objectID="03005">
<property><string>CIAV50 || CIAV60</string></property>
<rules logicalOperation="OR">
<object class="CompareVariable">
<property name="ruleId">
<string>CIAV50</string>
</property>
</object>
<object class="CompareVariable">
<property name="ruleId">
<string>CIAV60</string>
</property>
</object>
</rules>
</object>
</installChildren>
つまり、出力は次のように表示されます。
<object class="InstallComponent1" objectID="03fe9">
<property><string>CIAV962</string></property>
それ以外の
<object class="InstallComponent1" objectID="03fe9">
<property name="ruleExpression"><string><![CDATA[CIAV962]]</string></property>
XMLファイルを開くと、ルール式フィールドが空白のままです!!
私が解決に非常に近いのを助けてください:)ありがとう!!
2013 年 10 月 18 日 - 更新
nodeType == XML_CDATA_SECTION_NODE を追加する必要がありますか? ルール式のテンプレート一致で?