2012-05-02 48 views
0

目前我正在使用xpath與linq to xml在xml文檔中的特定元素之後添加元素。 我的擔心是如果這個層次太深,我不得不一直提到完整層次? 我不能直接以某種方式給出元素的名稱,之後我想添加我的新元素。更簡單的方法來使用LINQ在XML中添加元素

在這段代碼我談論這個層次: SESSIONANALYSER/AP /模式/ NI/STATEINFORMATION/INIT/INPUT [@ VALUE = 'SLN7DEACTIVATION'] /法

String strFile = File.ReadAllText(Server.MapPath("~/SessionAnalyserAccessories.xml")); 
      XDocument xdoc1 = XDocument.Parse(strFile); 
      xdoc1.XPathSelectElement("SESSIONANALYSER/AP/MODES/NI/STATEINFORMATION/INIT/INPUT[@VALUE='SLN7DEACTIVATION']/METHOD").AddAfterSelf(new XElement("METHOD", "", new XAttribute("NAME", "CHECKSUBSCRIBERBALANCE1"), new XAttribute("PARAMETERS", "SLN7"), new XAttribute("POSSIBLEACTIONS1", "FALLOUTON_FAILUREREGION_SETPSOFAILED_FALSE1"), new XAttribute("MAINTAINSESSION", "NO"), new XAttribute("RESPONSE", "-4"), new XAttribute("NEXTLEVEL", ""))); 

回答

2
使用XPath

那麼你可以使用descendant::INPUT[@VALUE='SLN7DEACTIVATION']/METHOD//INPUT[@VALUE='SLN7DEACTIVATION']/METHOD來查找任何級別的元素,因此如果您確定只有一個這樣的元素,那麼可以通過這種方式縮短路徑。但是,如果所有的祖先重要,以確定元素,然後使用長路徑。

在一個側面說明,而不是

String strFile = File.ReadAllText(Server.MapPath("~/SessionAnalyserAccessories.xml")); 
XDocument xdoc1 = XDocument.Parse(strFile); 

根本就

XDocument xdoc1 = XDocument.Load(Server.MapPath("~/SessionAnalyserAccessories.xml")); 

,允許XML解析器找到文檔的XML聲明正確的編碼,應該通過更有效不要先用長XML字符串讀取所有XML。

+0

太棒了!我現在使用這個代碼,我在這裏有一個疑問。此代碼找到一個匹配元素,然後插入新元素,如果要在所有匹配元素之後添加元素,該代碼在第一次匹配後停止。 xAttribute(「METHOD」,「」,new XAttribute(「NAME」,Parameters [0]),new XAttribute(「PARAMETERS」,Parameters新的XAttribute(「RESPONSE」,Parameters [4]),新的XAttribute(「POSSIBLEACTIONS1」,「Parameters [2]」),新的XAttribute(「MAINTAINSESSION」,參數[3] NEXTLEVEL「,Parameters [5])));' – Charu

+1

那麼如果您希望找到多個元素,則可以使用XPathSelectElements,並在返回的節點上使用foreach循環。另外,既然你既要查找也要插入'METHOD'元素,你需要首先調用ToList,例如(foreach)(XElement method in xdoc1.XPathSelectElements(「// INPUT [@ VALUE ='SLN7DEACTIVATION'/ METHOD」)。ToList()){method.AddAfterSelf(...); }'。 –

相關問題