2013-03-14 58 views
3

我是新來的XML在XML節點,我試圖使用德爾福XE TXMLDocument的在下面的XML訪問數據試圖找到利用ChildNodes.FindNode

<?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。

我錯過了什麼嗎?

回答

8

根節點使用名稱空間(AWS_SFC)。因此,XML文檔中的子節點必須攜帶相同的名稱空間,這在XML文檔中並非如此。

空白NameSpaceURI參數只需添加到FindNode程序,它會找到的節點:

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

@ User2168821的您的命名空間的複雜性是非常有限的。我對包含幾個命名空間的XML也有同樣的問題,並決定首先將它們全部剝離,這樣我就不會一直遇到這個問題。 – 2013-03-14 10:04:56

+0

謝謝!空白的NameSpaceURI參數有所不同。 – user2168821 2013-03-14 11:44:17

+1

@JanDoggen:只有當孩子節點沒有攜帶父節點的命名空間時纔會出現問題(這種方式不正確) – whosrdaddy 2013-03-14 19:12:19