2013-12-12 33 views
1

,所以我有一個包含與此類似結構的大規模的XML文件:XML解析 - 刪除節點,並保持整體結構

<Item ItemId=";ResTVersion" ItemType="0" PsrId="245" Leaf="false"> 
    <Disp Icon="Str" Expand="true" Disp="true" LocTbl="false" Order="13352" /> 
    <Modified By="sachink" DateTime="2008-12-16T19:02:35Z" /> 
    <PsrProps> 
     <Str Name="Kii" Val="yyyyyyyyyyyyy" /> 
    </PsrProps> 
    <Item ItemId=";ResTFileVersion" ItemType="0;ResT" PsrId="245" InstFlg="true" Leaf="true"> 
     <Str Cat="Text" UsrLk="true"> 
     <Val><![CDATA[ttttttttt]]></Val> 
     <Tgt Cat="Text" Orig="New"> 
      <Val><![CDATA[ttttttttt]]></Val> 
     </Tgt> 
     </Str> 
     <Disp Icon="Str" Order="13353" /> 
     <Modified By="sachink" DateTime="2008-12-16T19:02:35Z" /> 
     <Cmts> 
     <Cmt Name="Dev"><![CDATA[{Locked}]]></Cmt> 
     </Cmts> 
    </Item> 
    <Item ItemId=";ResTLanguageTag" ItemType="0;ResT" PsrId="245" InstFlg="true" Leaf="true"> 
     <Str Cat="Text" UsrLk="true"> 
     <Val><![CDATA[en-US]]></Val> 
     <Tgt Cat="Text" Orig="New"> 
      <Val><![CDATA[en-US]]></Val> 
     </Tgt> 
     </Str> 
     <Disp Icon="Str" Order="13354" /> 
     <Modified By="sachink" DateTime="2008-12-16T19:02:35Z" /> 
     <Cmts> 
     <Cmt Name="Dev"><![CDATA[=.ABVUDHUIDSHFUIDSHFUISHDFUIDSH iusdhfUIHAs]]></Cmt> 
     </Cmts> 
    </Item> 
    </Item> 

我有幾個項目的id,我想創建一個新的XML尊重舊的結構。 我使用此代碼來檢索我想要的節點,然後創建新的XML。

XmlNodeList nodes = originalXML.SelectNodes("//*[contains(@ItemId,'" + id + "')]"); 

所以,我想要的是刪除一些節點,但我只有我想保持者的ID。 問題是當你使用selectnodes函數來獲取內部節點時,你如何保持xml的外部結構?

謝謝!

+0

爲什麼不只是沒有項目的XML模板,並根據需要在文檔中動態添加項目?那有意義嗎 ? –

回答

0

我會採取相反的方式:刪除你不需要的東西。很難從頭開始構建一個XmlDocument(需要大量的編碼)。

0

我認爲你會更好地移除你不想從現有結構中獲得的節點。

XmlNodeList nodes = originalXML.SelectNodes("/*[not(contains(@test,'test'))]") 
foreach(XmlNode node in nodes) 
    originalXML.RemoveChild(node); 

應該工作。

如果你需要保留你的原始結構,你可以originalXML.Clone()它。

旁註:你可能想看看System.Xml.Linq.XDocumentSystem.Xml.Linq.XElement我發現那些更容易使用。