0

NativeXML v4.09 を使用して XML ファイルを作成しようとしており、次のような構造で使用しています。

<?xml version="1.0" encoding="utf-8"?>
<Root>
   <word1 word2>this is value</word1 word2>
</Root>

私はこのような簡単なコードを書きます:

procedure TForm1.ButtonWriteClick(Sender: TObject);
var aaa: TNativeXml;
    vSectionName : string;
begin
    vSectionName := 'word1 word2';//Name of Section with two words sparated with space
    aaa:= TNativeXml.Create(Self);
    aaa.CreateName('Root');
    aaa.Root.NodeNew(vSectionName);

    aaa.Root.NodeByName('word1 word2').Value:='this is value';

    aaa.XmlFormat := xfReadable;

    aaa.SaveToFile('test.xml');
end;

セクションのノードを読み取るには、次のようなコードを記述します。

procedure TForm1.ButtonReadClick(Sender: TObject);
var aaa : TNativeXml;
    vSectionName : string;
    vNode : TXmlNode;
begin
    vSectionName := 'word1 word2';//Name of Section with two words sparated with space
    try
       aaa := TNativeXml.Create(Self);
       aaa.LoadFromFile('test.xml');
       vNode := aaa.Root.NodeByName(vSectionName);
       if vNode=nil then
          ShowMessage('Section not found')
       else
          ShowMessage('Section found');
    finally
       FreeAndNil(aaa);
    end;
end;

上記の構造を持つ XML ファイル「test.xml」を作成できます。しかし、vNode はNodeByName関数から常に NILであるため、2 つの単語名 (「word1 word2」名など) を持つノード セクションを読みたい場合、常に「セクションが見つかりません」というメッセージが表示されます。

次に、エラーを追跡するために、NativeXML.TXMLNode.NodeByName関数に次のようなコードを追加します。

function TXmlNode.NodeByName(const AName: Utf8String): TXmlNode;
var i: integer;
    vF : boolean;
begin
    result := nil;
    for i := 0 to GetNodeCount - 1 do begin
       vF := (Utf8CompareText(GetNodes(i).Name, AName) = 0);
       if vF then
          Application.MessageBox(PWideChar('TXmlNode.NodeByName-> Found AName='+AName+'|GetNodes('+IntToStr(i)+').Name='+GetNodes(i).Name+'|GetNodes('+IntToStr(i)+').NameUnicode='+GetNodes(i).NameUnicode),'TXmlNode.NodeByName',0)
       else
          Application.MessageBox(PWideChar('TXmlNode.NodeByName-> Not Found AName='+AName+'|GetNodes('+IntToStr(i)+').Name='+GetNodes(i).Name+'|GetNodes('+IntToStr(i)+').NameUnicode='+GetNodes(i).NameUnicode),'TXmlNode.NodeByName',0);
       //if (Utf8CompareText(GetNodes(i).Name, AName) = 0) then
       if vF then begin
         Result := GetNodes(i);
         exit;
       end;
    end;
end;

そして、このメッセージボックスを取得します:

メッセージボックス表示

セクション名が 2 つの単語 ("word1 word2" name) から 1 つの単語 ("word1" name) に変更されていることがわかります。

これは、スペースを含む複数の単語名を持つセクション名のバグですか、それともセクションの名前はスペースを含まない単一の単語でなければなりませんか? セクションの名前が単一の単語以上でスペースを含まない必要がある場合、セクションの名前にスペースを含む 2 つ以上の単語を含む XML を作成できるのに、 NodeByName で読み取るときにセクション ノードを取得できないのはなぜですか?

4

2 に答える 2

1

XML 要素の名前にスペースを含めることはできません。XML ドキュメントを作成するときに、XML ライブラリが空白の名前を許可する場合、そのライブラリは間違っています。ベンダーにバグを報告する必要があります。(ただし、正しいプログラムは最初から複数の単語の名前を試みるべきではないため、バグ レポートは使用上のエラーとして却下される可能性があります。)

データを表す別の方法を考え出す必要があります。おそらく、セクション名を属性値に格納するか、要素の内容として格納できます。

于 2016-04-19T04:43:20.420 に答える