我试图遍历一些XML并将字符串的值设置为等于特定节点内容。 XML看起来像:
<RootNode>
<SubNode>test<SubNode>
<SubNode><ExtraMarkup>some value</ExtraMarkup><SubNode>
</RootNode>
每个子节点可以包含一个值或其他XML子节点。对于第一个子节点,此代码正常工作:
for Node := 0 to RootNode.childNodes.length-1 do begin
AttrValue := RootNode.childNodes[Node].selectSingleNode('SubNode').Text;
// More code here...
end;
问题是当子节点包含子节点时。我希望AttrValue的值为“test
”或“<ExtraMarkup>some value</ExtraMarkup>
”作为字符串。
如果不是文本而是获取XML属性,则不会保留标记。
答案 0 :(得分:1)
我想你可能想要“IXmlNode.NodeValue”。
以下是一个例子:
Function TGlobalConfig.GetXmlItem(CurNode : IXMLNODE; Section : String; var Value : String; Default : String) : Boolean;
var
ChildNode: IXMLNode;
begin
if Assigned(CurNode) then
begin
ChildNode := CurNode.ChildNodes.FindNode(Section);
if (ChildNode <> nil) then
if VarIsNull(ChildNode.NodeValue) then
Value := Default
else Value := ChildNode.NodeValue;
...
答案 1 :(得分:1)
而不是.Text
您需要InnerText
或InnerXml
等属性。
答案 2 :(得分:0)
for Node := 0 to RootNode.childNodes.length-1 do begin
// Check if the Value stored in SubNode node is xml
if (RootNode.childNodes[Node].selectSingleNode('SubNode').hasChildNodes and
DealAttributesNode.childNodes[Node].selectSingleNode('SubNode').childNodes[0].hasChildNodes) then begin
AttrValue := RootNode.childNodes[Node].selectSingleNode('SubNode').childNodes[0].Xml;
end
else begin
AttrValue := RootNode.childNodes[Node].selectSingleNode('SubNode').Text;
end;
end;