2013-10-01 70 views
1

我在使用Delphi閱讀一些XML節點時遇到了問題。 我想從這個XML代碼讀取ID閱讀xml的ID和狀態節點

例如:

<row name="String.101" status="new" comment=""> 
     <native>&quot;User Name&quot;</native> 
     <lang id="en" status="ready">&quot;User Name&quot;</lang> 
     <lang id="fr" status="translated">&quot;Nom d&apos;utilisateur&quot;</lang> 
     <lang id="hu" status="translated">&quot;Felhasználó neve&quot;</lang> 
     <lang id="it" status="translated">&quot;Nome utente&quot;</lang> 
     <lang id="zh" status="translated">&quot;用戶名&quot;</lang> 
     <lang id="de" status="ready">&quot;Benutzername&quot;</lang> 
    </row> 

我的計劃應該給我「恩」中的「ID =」 EN「」,但它讓我看到‘用戶名’在該行的末尾。

哪裏是我的Delphi代碼我的錯誤?

begin 
     TransNodes := XMLDocument.DocumentElement.ChildNodes['targets'].ChildNodes['target'].ChildNodes['stringdata'].ChildNodes; 

     for i := 0 to TransNodes.Count -1 do 
     begin 
     sContext  := TransNodes[i].Attributes['name']; 
     sOriginalStatus := TransNodes[i].Attributes['status']; 
     sNativeText  := TransNodes[i].ChildNodes['native'].Text; 
     sLangId   := TransNodes[i].ChildNodes['id'].Text; 
     sStatus   := TransNodes[i].ChildNodes['status'].Text; 
     Delete(sNativeText, Length(sNativeText), 1); 
     Delete(sNativeText, 1, 1); 
     Delete(sLangId, Length(sLangId), 1); 
     Delete(sLangId, 1, 1); 
     Delete(sStatus, Length(sStatus), 1); 
     Delete(sStatus, 1, 1); 


     Memo.Lines.Add(sContext + ' ' + sOriginalStatus + ' ' + sNativeText + ' ' + sLangId + ' ' + sStatus); 

我.Attributes與.ChildNodes試了一下......以.Attributes德爾福shwos我一個錯誤。 與狀態相同的問題。例如,我想要「狀態=」準備好「」,但他什麼也沒給我。

謝謝你的幫助和時間。

+0

對不起,第一個鏈接是錯誤的! 這是正確的;) https://www.dropbox.com/sh/zoyudjkn4oevtt4/LbHmzPfdpU/Share/2013/10#lh:null-xml%20code.png – Umberto

+0

你有沒有試過註釋掉Delete( ...代碼行,可能是你只是刪除了你的結果? – fuchs777

+1

我試過了,但沒有任何事情發生,它不會告訴我我需要的消息 – Umberto

回答

2

您嘗試訪問ID和狀態爲節點,但這些都是「郎」節點

嘗試以下方法(未經測試,但它應該訪問的第一個「郎」節點的屬性...它應該被包裹在另一個for循環中,因爲您有多個'lang'節點)

sLangId := TransNodes[i].ChildNodes['lang'].firstChild.Attributes['id']; 
sStatus := TransNodes[i].ChildNodes['lang'].firstChild.Attributes['status'];