- PR -

MSXMLでのノード追加について

1
投稿者投稿内容
sasaki
会議室デビュー日: 2008/06/04
投稿数: 5
投稿日時: 2008-06-04 18:10
こんにちは。よろしくお願いします。

DelphiでMSXMLを使用しております。

デフォルト名前空間が指定されているXMLで、名前空間をプレフィックス指定し(※)、取得したノードに対してノードを追加すると、タグに「xmlns=""」が入ってしまい困っております。

※ プレフィックスを指定しないと「selectSingleNode」でノードがリターンされないため

[XML]
------------------------------------------------------------------
<?xml version='1.0'?>
<Books xmlns="urn:books">
 <Book>
  <Title>Beginning XML</Title>
  <Publisher>Wrox</Publisher>
 </Book>
</Books>

[ソース]
------------------------------------------------------------------
procedure TForm1.Test;
var
 doc : IXMLDOMDocument2;
 node, item : IXMLDOMNode;
begin
 doc := CoDOMDocument40.Create();
 doc.load('test.xml');
 doc.setProperty('SelectionNamespaces', 'xmlns:bk="urn:books"');

 node := doc.selectSingleNode('/bk:Books/bk:Book');
 if node <> nil then begin
  item := doc.createElement('TEST');
  item.appendChild(doc.createTextNode('TEXT'));
  Node.appendChild(item);
 end;

 doc.save('test.xml');
end;

[結果]
------------------------------------------------------------------
<?xml version="1.0"?>
<Books xmlns="urn:books">
 <Book>
  <Title>Beginning XML</Title>
   <Publisher>Wrox</Publisher>
   <TEST xmlns="">TEXT</TEST>   ←ここです
  </Book>
</Books>

------------------------------------------------------------------
<TEST xmlns="">TEXT</TEST>

ではなく、

<TEST>TEXT</TEST>

とノードを追加する方法がありましたら、ご教授ください。
よろしくお願いします。

スフレ
ぬし
会議室デビュー日: 2005/05/27
投稿数: 281
お住まい・勤務地: 東京
投稿日時: 2008-06-04 18:36
createElement()が作るのは名前空間が空のTEST要素なので、これは仕様どおり動いています。

MSXMLは使ったことないんですが、調べてみるとdoc.createNode()で名前空間付きの要素が作成できるようですね。
sasaki
会議室デビュー日: 2008/06/04
投稿数: 5
投稿日時: 2008-06-05 09:22
スフレさん、こんにちは。

doc.createNode()

を使うことで解決できました。

ありがとうございました。

--------------------------------------------------------------------
procedure TForm1.test;
var
 doc : IXMLDOMDocument2;
 node ,
 item : IXMLDOMNode;
begin
 doc := CoDOMDocument40.Create();
 doc.load('test.txt');
 doc.setProperty('SelectionNamespaces', 'xmlns:bk="urn:books"');

 node := doc.selectSingleNode('/bk:Books/bk:Book');
 if node <> nil then begin
// item := doc.createElement('TEST');              ←変更
  item := doc.createNode(NODE_ELEMENT, 'TEST', 'urn:books');  ←変更
  item.appendChild(doc.createTextNode('TEXT'));
  Node.appendChild(item);
 end;

 doc.save('test.xml');
end;
1

スキルアップ/キャリアアップ(JOB@IT)