C#读取XML层次结构并从父级使用故障转移
我想创建以下XML。C#读取XML层次结构并从父级使用故障转移,c#,xml,hierarchy,xmlreader,failover,C#,Xml,Hierarchy,Xmlreader,Failover,我想创建以下XML。 在一个父节点中有许多子节点,父节点包含与子节点相关的节点(作为子节点的默认值),如果子节点缺少一个节点,则父节点将作为故障转移,并为kis提供其默认节点 <parents> <parent> <!--all parent related nodes will be here--> <kid-prop>default kid prop</kid-prop><!--this is
在一个父节点中有许多子节点,父节点包含与子节点相关的节点(作为子节点的默认值),如果子节点缺少一个节点,则父节点将作为故障转移,并为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);
}