線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2210
推到 Plurk!
推到 Facebook!

XML 標籤以 fc:... 開頭的無法用節點名稱讀取

缺席
cancer
高階會員


發表:58
回覆:319
積分:190
註冊:2004-07-31

發送簡訊給我
#1 引用回覆 回覆 發表時間:2011-09-26 15:31:25 IP:220.128.xxx.xxx 未訂閱
各位好,對 XML 剖析不太熟,請幫忙一下。
我用 TXMLDocument 載入 XML 文件內容,節點交給 IXmlNode 來處理,標籤名稱沒有 fc: 開頭的,都讀得到,例如

2011-09-26
ChildNode := MainNode.ChildNodes['SendingDate'];

但如果是,有 fc: 開頭的,例如這樣,就讀不到
88421111000403130001
ChildNode := MainNode.ChildNodes['fc:MessageIdentifier];

最後只好改用迴圈來讀
for i := 0 to MainNode.ChildNodes.Count - 1 do
begin
i f ChildNode.NodeName = 'fc:MessageIdentifier' then
...................
end;

我覺得這樣不方便,既然已經知道節點名稱,當然是直接用節點名稱來讀,程式看起來比較順眼,有人知道原因嗎?


rick060
高階會員


發表:2
回覆:112
積分:217
註冊:2009-11-17

發送簡訊給我
#2 引用回覆 回覆 發表時間:2011-09-28 09:05:58 IP:60.250.xxx.xxx 未訂閱
xml 我沒用過delphi 內建的元件,我都是使用 msxml
對於有 namespace 的 tag 要先設定 property 才能讀取

以下例
var
pXMLDoc : IXMLDOMDocument2;
pRootNode : IXMLDOMNode;

~~~
hr := CoCreateInstance(CLASS_DOMDocument60, nil, CLSCTX_INPROC_SERVER,IID_IXMLDOMDocument, pXMLDoc);
if FAILED(hr) then
raise Exception.Create('MSXML2:CoCreateInstance Error');

hr := pXMLDoc.QueryInterface(IID_IXMLDOMNode, pRootNode);
if FAILED(hr) then
raise Exception.Create('MSXML2:QueryInterface Error');

IsSuccess := pXMLDoc.loadXML(szWorkingStr);
if IsSuccess <> True then
raise Exception.Create( '無效字串' );

pXMLDoc.setProperty('SelectionNamespaces','xmlns:h="http://www.w3.org/TR/html4/"'); //設定 namespace ,可多組

pRootNode := pXMLDoc.selectSingleNode( 'root/h:ID' );
ShowMessage( pRootNode.text );
~~
內建元件一定也有類似的方法,試試。
cancer
高階會員


發表:58
回覆:319
積分:190
註冊:2004-07-31

發送簡訊給我
#3 引用回覆 回覆 發表時間:2011-09-30 14:54:34 IP:220.128.xxx.xxx 未訂閱
rick大,這真是超不方便,如果同一份文件裡面標籤有很多種,每讀一個節點,都要先設定一次 name space。
我是用 Delphi 的 TXmlDocument,TXmlDocument 有關 namespace 的 Option 只有兩個,都跟建立節點有關,跟讀取無關。

還有一個狀況,程式碼如下,只需注意最後一行:
RootNode : IXmlNode;
...
RootNode := xmldoc.AddChild('X301InspectionApplication');
RootNode.Attributes['xmlns'] := 'urn:BOFT:X301X302X303X304Inspection:1.2';
RootNode.Attributes['xmlns:fc'] := 'urn:BOFT:FundamentalComponents:1.0';
RootNode.Attributes['xmlns:ft'] := 'urn:BOFT:FundamentalTypes:1.0';
RootNode.Attributes['xmlns:xsi'] := 'http://www.w3.org/2001/XMLSchema-instance';
RootNode.Attributes['xsi:schemaLocation'] := 'urn:BOFT:X301X302X303X304Inspection:1.2 X301X302X303X304Inspection.xsd';

明明是打 xsi:schemaLocation,產生的 xml 檔,都變成 schemaLocation,前面的 xsi. 都會消失,最後,我只好用 TStringlist 把檔案讀進來,再把 xsi. 補上去,好麼煩,有誰知道原因?

系統時間:2017-11-19 18:12:03
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!