如何从XML中提取子节点值作为字符串

时间:2012-08-22 16:27:41

标签: xml delphi xpath xml-parsing

我试图遍历一些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属性,则不会保留标记。

3 个答案:

答案 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您需要InnerTextInnerXml等属性。

答案 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;