TNativeXML

时间:2016-04-19 04:24:40

标签: xml delphi nativexml

我尝试使用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;

要读取Section的节点,我会编写如下代码:

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文件&#34; test.xml&#34;结构高于我想要的。但是,当我想要读取节点部分时,有两个单词的名称(如&#34; word1 word2&#34; name)总是得到消息&#34;未找到部分&#34;因为来自 NodeByName vNode总是NIL

然后为了跟踪错误,我在 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;

获取此消息框:

MessageBox display

我看到部分名称从两个单词(&#34; word1 word2&#34;名称)变为单个单词(&#34; word1&#34;名称)。

这是一个带有多个单词名称和空格的节名称中的错误,或者该节的名称只是一个单词没有空格吗?如果部分名称必须单个单词或更多且没有空格,为什么我们可以使用带有空格的两个或多个单词创建带有部分名称的XML,但是当我们无法获得部分节点时我们用NodeByName读它?

2 个答案:

答案 0 :(得分:1)

您的文档无效XML。标记名称不得包含空格字符。

XML规范:XML Start-Tags, End-Tags, and Empty-Element Tags

答案 1 :(得分:1)

XML元素的名称中不能包含空格。如果XML库在创建XML文档时允许间隔名称,那么该库是错误的。您应该将错误报告给供应商。 (但是,错误报告可能会被视为使用错误,因为没有正确的程序应该首先尝试使用多个单词的名称。)

您需要提出一些其他方式来表示您的数据。也许您可以将节名存储在属性值中,或者作为元素内容存储。