我正在尝试使用 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”名称)的节点部分时,总是会收到消息“未找到部分”,因为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;
并得到这个消息框:
我看到部分名称从两个单词(“word1 word2”名称)变为单个单词(“word1”名称)。
这是包含多个单词的部分名称中的错误,名称带有空格还是部分名称必须是一个没有空格的单词?如果节的名称必须是一个或多个单词并且没有空格,为什么我们可以创建带有两个或多个带空格的单词的节名的 XML,但是当我们使用 NodeByName 读取它时却无法获取节节点?