[英]C# Read XML Hierarchy and use FailOver from the parent
我想創建以下XML。
一個父級中有許多孩子,父級包含與孩子相關的節點(這是孩子的默認節點),如果孩子缺少節點,則父級將成為故障轉移節點,並將kis作為其默認節點。
<parents>
<parent>
<!--all parent related nodes will be here-->
<kid-prop>default kid prop</kid-prop><!--this is the default for all kids-->
<kids>
<kid>
<kid-prop>some data</kid-prop>
</kid>
<kid></kid><!--since this kid does not have have <kid-prop>, it will be taken from the parent-->
<kids>
<parent>
<parents>
如何以編程方式做到這一點不費吹灰之力,問題是,是否有任何注釋方法可以告訴xmlreader父級是孩子的故障轉移,以防孩子丟失某些東西
否-XmlReader會照原樣讀取XML,沒有“注釋”的概念。 如果您使用的是System.Xml.Linq而不是XmlReader,那將非常簡單:
var defaultValue = (string)root.Element("parent").Element("kid-prop");
root.Element("parent").Element("kids")
.Elements("kid")
.Select(kid =>
kid.Elements("kid-prop").Any() ?
(string)kid.Element("kid-prop") : defaultValue);
通過使用XmlReader,您可以解決要求,但需要進行大量檢查
下面是示例代碼
using (XmlReader reader = XmlReader.Create(@"D:\Sample.xml"))
{
bool b = false;
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element)
{
if (reader.Name == "parent")
{
b = true;
}
if (reader.Name == "kid")
b = false;
if (!b && reader.Name == "kid-prop")
{
Console.WriteLine(reader.ReadElementContentAsString());
}
if (b && reader.Name == "kid-prop")
{
Console.WriteLine(reader.ReadElementContentAsString());
}
}
}
}
否則,最好使用linq到xml,如下所示
XElement root = XElement.Load(@"D:\Sample.xml");
var coll = root.Element("parent").Element("kids").Elements("kid").Select(kid => kid.Elements("kid-prop").Any() ? (string)kid.Element("kid-prop") : (string)root.Element("parent").Element("kid-prop"));
foreach (var item in coll)
{
Console.WriteLine(item);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.