TNativeXML中包含多个单词的节名称



我正在尝试使用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"。但当我想读取具有两个单词名称的节点节(如"word1 word2"名称)时,总是会收到消息"section not found",因为vNode始终是来自NodeByName函数的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显示

我看到部分名称从两个单词("word1 word2"名称)变为一个单词("word1"名称)。

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

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

XML规范:XML开始标记、结束标记和空元素标记

XML元素的名称中不能有空格。如果在创建XML文档时,XML库允许使用间隔名称,则该库是错误的。您应该向供应商报告错误。(不过,错误报告可能会被视为使用错误而不予理会,因为任何正确的程序都不应该首先尝试多单词名称。)

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

相关内容

  • 没有找到相关文章

最新更新