Mas*_*ler 3 xml delphi remobjects
我有一些简单的XML处理代码,它应该根据属性值定位传入节点的子节点:
function GetNodeByAttributeValue(
const AParentNode: IXMLNode;
const AttributeName: string; AttributeValue: Variant): IXMLNode;
var
i: integer;
value: Variant;
begin
result := nil;
if (not Assigned(AParentNode)) or (AttributeName = '') then
exit;
for i := 0 to AParentNode.ChildrenCount-1 do
begin
result := AParentNode.Children[i];
value := result.GetAttributeValue(AttributeName, UnAssigned);
if not VarIsEmpty(value) then
exit;
end;
result := nil;
end;
Run Code Online (Sandbox Code Playgroud)
很简单,对吧?但是当我尝试运行它时,在某些情况下它会因访问冲突而崩溃.这是发生了什么:
IXMP*实现由RemObjects SDK库提供. result.GetAttributeValue电话uROMSXMLImpl.TROMSXMLNode.GetAttributeValue,电话TROMSXMLNode.GetAttributeByName,说
node := fNode.attributes.getNamedItem(anAttributeName);
Run Code Online (Sandbox Code Playgroud)
这会崩溃因为fNode.attributes返回nil.据我了解,这不应该发生.
奇怪的是,回到原始函数中的for循环,AParentNode.ChildrenCount返回3.但原始XML文档中的节点只有一个子节点.它符合我正在寻找的标准.
<ParentNode>
<namespace:ChildNode name="right-name">
Run Code Online (Sandbox Code Playgroud)
但AParentNode.ChildrenCount返回3.我在调试器中打开它们并得到:
AParentNode.Children[0].name: '#text'
AParentNode.Children[1].name: 'namespace:ChildNode'
AParentNode.Children[2].name: '#text'
Run Code Online (Sandbox Code Playgroud)
这些"#text"节点在世界上是什么?它们不在XML文档中,我没有编写任何代码来插入它们.它们为什么存在,为什么它们有问题?我能做些什么来阻止它们搞砸我的属性搜索?