【问题标题】:Trying to find nodes in XML using ChildNodes.FindNode尝试使用 ChildNodes.FindNode 在 XML 中查找节点
【发布时间】:2013-03-14 18:23:27
【问题描述】:

我是 XML 新手,正在尝试使用 Delphi XE TXMLDocument 访问以下 XML 中的数据

<?xml version="1.0" encoding="UTF-8" ?>
<sfc:SFC xmlns:sfc="AWS_SFC">
    <ID>4294967295</ID>
    <SFC_TYPE>
        <WindSpeed>18</WindSpeed>
        <WindDir>123.6</WindDir>
        <Temperature>22.9</Temperature>
        <Pressure>1013.25</Pressure>
        <Humidity>57.9</Humidity>
        <DewPoint>16.8</DewPoint>
    </SFC_TYPE>'
    <Location>
        <longitude>18.5</longitude>
        <latitude>-34.5</latitude>
        <altitude>50.8</altitude>
    </Location>
    <StampDateTime>2012-12-17T09:30:47.0Z</StampDateTime>
</sfc:SFC>

我的代码是这样开始的:

var
  SFC_Info: IXMLNode;
  SFC_Type: IXMLNode;
begin
  SFC_Info := XMLDocument1.DocumentElement;
  SFC_Type := SFC_Info.ChildNodes.First;
  while (SFC_Type.NodeName <> 'SFC_TYPE') do
    SFC_Type := SFC_TYPE.NextSibling;
  memDebug.Lines.Add('Wind speed = ' + SFC_Type.ChildNodes.FindNode('WindSpeed').Text);
  etc

这是我想要的,但使用循环似乎很乱。我原以为可以通过

来访问“SFC_TYPE”节点
  SFC_Type := SFC_Info.ChildNodes.FindNode('SFC_TYPE');

但这会返回 nil。

我错过了什么吗?

【问题讨论】:

    标签: xml delphi


    【解决方案1】:

    根节点使用命名空间 (AWS_SFC)。因此,XML 文档中的子节点必须携带相同的命名空间,而您的 XML 文档中并非如此。

    只需在FindNode 过程中添加一个空白的NameSpaceURI 参数,它就会找到节点:

    SFC_Type := SFC_Info.ChildNodes.FindNode('SFC_TYPE', '');
    

    【讨论】:

    • @User2168821 命名空间的复杂性非常有限。我在使用包含多个命名空间的 XML 时遇到了同样的问题,并决定首先将它们全部剥离,这样我就不会一直遇到这个问题。
    • 谢谢!空白的 NameSpaceURI 参数产生了影响。
    • @JanDoggen:只有当子节点不携带父节点的命名空间时才会出现问题(顺便说一句,这是不正确的......)
    猜你喜欢
    • 1970-01-01
    • 2014-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多