goo

XML

XML DOMメモ
※varuseでcomresの変数チェック等を省略しています。

ファイルの作成
スクリプトの文字列変数から、ファイルを作成。asyncプロパティは、1が非同期ダウンロード、0が同期。デフォルトは1。非同期の場合、loadメソッドはすべての読み込みを完了する前に戻ります。loadXMLメソッドは、指定された文字列を読み込みます。saveメソッドは、指定したファイル名に保存します。
以下のコードを実行すると、カレントフォルダに「persons.xml」ファイルを保存します。
code
sdim bufXML, 32
bufXML = "<persons><person><name>青木</name></person></persons>"
axobj XMLDoc, "Msxml2.DOMDocument", 0, 0
XMLDoc("async") = 0
XMLDoc->"loadXML" bufXML
XMLDoc->"save" "persons.xml"
font msgothic, 12
mes XMLDoc("xml")

出力ファイル:「persons.xml」
<persons><person><name>青木</name></person></persons>

ファイルの読み込み
loadメソッドは、指定したファイル名を読み込みます。
code
axobj XMLDoc, "Msxml2.DOMDocument", 0, 0
XMLDoc("async") = 0
XMLDoc->"load" "persons.xml"
font msgothic, 12
mes XMLDoc("xml")

XML宣言
以下のコードは、XML宣言<?xml version="1.0" encoding="UTF-8"?>を挿入しています。createProcessingInstructionメソッドでProcessingInstructionノードを作成(pi)して、insertBeforeメソッドで、指定したXMLDoc("firstChild")の前に挿入します。挿入前のXMLDoc("firstChild")は、「<persons/>」です。 ※mes表示では、encoding…がありませんがデータとして存在します(ファイル参照)。
code
axobj XMLDoc, "Msxml2.DOMDocument", 0, 0
XMLDoc("async") = 0
XMLDoc->"loadXML" "<persons/>"
comres pi
sdim data, 64
data = "version=¥"1.0¥" encoding=¥"UTF-8¥""
XMLDoc->"createProcessingInstruction" "xml", data
XMLDoc->"insertBefore" pi, XMLDoc("firstChild")
XMLDoc->"save" "persons.xml"
font msgothic, 12
mes XMLDoc("xml")

出力ファイル:「persons.xml」
<?xml version="1.0" encoding="UTF-8"?>
<persons/>

挿入
元データ
  <persons>
    <person>
      <name>青木</name>
      <age>24</age> 
    </person>
    <person>
      <name>川崎</name> 
      <age>18</age> 
    </person>
    <person>
      <name>坂本</name> 
      <age>32</age> 
    </person>
  </persons>
-->
挿入後のデータ
  <persons>
    <person>
      <name>青木</name>
      <age>24</age> 
    </person>
    <person type="1">
      <!-- 3要素中2番目に挿入 -->
      <name>麻生</name>
      <age>16</age> 
    </person>
    <person>
      <name>川崎</name> 
      <age>18</age> 
    </person>
    <person>
      <name>坂本</name> 
      <age>32</age> 
    </person>
  </persons>

上記の表のように挿入してみる。追加するだけならばappendChildメソッドを利用する。上記は、見やすいように字下げしています。作成されたファイルをIEで開くと整形されて表示されます。

XPathの指定
setPropertyメソッドで、SelectionLanguageプロパティをXPathに変更。デフォルトはXSLPattern。

挿入する要素の作成
createElementメソッドでperson、name、age要素を作成する。personのsetAttributeメソッドで属性を追加する。createCommentメソッドでコメント要素を作成する。personのappendChildメソッドで、コメント、name、age要素を追加する。

条件1 川崎の前に挿入したい場合
selectSingleNodeメソッドでnameが川崎のperson要素を取得する。insertBeforeメソッドで、要素を挿入する。

条件2 2番目に挿入したい場合
getElementsByTagNameメソッドでperson要素のノードリストを取得する。ノードリストのitemメソッドで2番目の要素を取得する。insertBeforeメソッドで、要素を挿入する。

code
axobj XMLDoc, "Msxml2.DOMDocument", 0, 0
XMLDoc("async") = 0
XMLDoc->"setProperty" "SelectionLanguage", "XPath"

sdim bufXML, 1024
bufXML = {"<persons>
		<person>
			<name>青木</name>
			<age>24</age>
		</person>
		<person>
			<name>川崎</name>
			<age>18</age>
		</person>
		<person>
			<name>坂本</name>
			<age>32</age>
		</person>
	</persons>"}
XMLDoc->"loadXML" bufXML

root = XMLDoc("documentElement")

// person要素数の取得
comres nodelist
root->"getElementsByTagName" "person"
lenperson = nodelist("length")

// 挿入要素の作成
comres newperson
XMLDoc->"createElement" "person"
comres resTmp
newperson->"setAttribute" "type", "1"

comres newcomment
tmpbuf = "" + lenperson + "要素中2番目に挿入"
XMLDoc->"createComment" tmpbuf
newperson->"appendChild" newcomment

comres newname
XMLDoc->"createElement" "name"
newname("text") = "麻生"
newperson->"appendChild" newname

comres newage
XMLDoc->"createElement" "age"
newage("text") = "16"
newperson->"appendChild" newage

/*
// 川崎を含むperson要素の取得
comres findperson
root->"selectSingleNode" "/persons/person[name = '川崎']"
if( varuse(findperson) ){
	root->"insertBefore" newperson, findperson
}
*/

//*
// 2番目に挿入
comres findperson
nodelist->"item" 1
root->"insertBefore" newperson, findperson
//*/

XMLDoc->"save" "persons.xml"
font msgothic, 12
mes XMLDoc("xml")

要素の削除と変更
nameが坂本のperson要素全体を削除して、nameが青木のageを20に変更します。
removeChildメソッドで削除します。ノードのテキストを変更した場合、子要素も削除されるためにitemを取得して変更しています。
code
axobj XMLDoc, "Msxml2.DOMDocument", 0, 0
XMLDoc("async") = 0
XMLDoc->"setProperty" "SelectionLanguage", "XPath"

sdim bufXML, 1024
bufXML = {"<persons>
		<person>
			<name>青木</name>
			<age>24</age>
		</person>
		<person>
			<name>川崎</name>
			<age>18</age>
		</person>
		<person>
			<name>坂本</name>
			<age>32</age>
		</person>
	</persons>"}
XMLDoc->"loadXML" bufXML

root = XMLDoc("documentElement")

// nameが坂本のperson要素を取得
comres person
root->"selectSingleNode" "/persons/person[name = '坂本']"
// 坂本の要素の親ノードを取得
parent = person("parentNode")
// 坂本の要素を削除
parent->"removeChild" person

// nameが青木のage要素を取得
comres age
root->"selectSingleNode" "/persons/person/age[//name = '青木']"
// ageの変更
child = age("childNodes")
ret = 0
repeat child("length")
	comres item
	child->"item" cnt
	if( item("nodeType") == 3 ){ // NODE_TEXT (3)
		item("text") = "20"
		ret = 1
		break
	}
loop
if( ret == 0 ){
	comres text
	XMLDoc->"createTextNode" "20"
	age->"appendChild" text
}
XMLDoc->"save" "persons.xml"
font msgothic, 12
mes XMLDoc("xml")
コメント ( 0 ) | Trackback ( 0 )