2017-07-07 99 views
3

我在互聯網上發現了這個。C#識別XML文件中的父元素,子元素

string xml = @" 
<food> 
    <child> 
    <nested /> 
    </child> 
    <child> 
    <other> 
    </other> 
    </child> 
</food> 
"; 

XmlReader rdr = XmlReader.Create(new System.IO.StringReader(xml)); 
while (rdr.Read()) 
{ 
    if (rdr.NodeType == XmlNodeType.Element) 
    { 
    Console.WriteLine(rdr.LocalName); 
    } 
} 

的上述結果將是

food 
child 
nested 
child 
other 

這是工作完美的,只是我需要確定哪些元素包含子元素。

例如,我需要這個輸出

startParent_food 
    startParent_child 
     nested 
    endParent_child 
    startParent_child 
     other 
    endParent_child 
endParent_food 
+0

您的要求不明確。除**''和''之外的所有元素都包含子元素。 – Tomalak

+0

@Tomalak其實我想用不同的值重新構造XML相同的結構...所以我需要識別父母是否有孩子...... –

回答

4

你可以用XmlReader來做到這一點,但它不會特別容易。你不知道一個元素是否有孩子而沒有繼續閱讀,所以你必須緩衝和跟蹤各種事情(因爲XmlReader是隻向前)。除非你有充分的理由使用如此低級的API,否則我強烈建議你避免使用它。

這與LINQ相當瑣碎XML

private static void Dump(XElement element, int level) 
{ 
    var space = new string(' ', level * 4); 

    if (element.HasElements) 
    { 
     Console.WriteLine("{0}startParent_{1}", space, element.Name); 

     foreach (var child in element.Elements()) 
     { 
      Dump(child, level + 1); 
     } 

     Console.WriteLine("{0}endParent_{1}", space, element.Name); 
    } 
    else 
    { 
     Console.WriteLine("{0}{1}", space, element.Name); 
    } 
} 

如果,你在你的評論暗示,您的實際需求是修改一些值,則可以做到這一點沒有任何需要處理的細節XML結構。例如,修改nested元素的值:

var doc = XDocument.Parse(xml); 

var target = doc.Descendants("nested").Single(); 

target.Value = "some text"; 

var result = doc.ToString(); 

兩個的演示中看到this fiddle

+0

哇。非常精彩...!我已經花了幾個小時... :) –

+0

是的先生,但實際上可能有超過2個元素具有相同的名稱...與不同的父節點....所以這是可能的嗎?沒有任何詳細的過程? –

+1

@jiyaali是的,你可以明確地指定路徑,例如'doc.Descendants( 「子」)。元素( 「嵌套」)。單()'。我建議你閱讀一些LINQ to XML文檔或教程。 –

0

爲了檢查子元素,你的代碼將類似於下面:

System.Xml.Linq.XElement _x; 
    _x = System.Xml.Linq.XElement.Parse(xml); 

    if (_x.HasElements) 
    { 
     // your req element 
    } 

你將不得不讓它遞歸查詢的所有元素。