首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#读取XML层次结构并从父级使用FailOver。

C#读取XML层次结构并从父级使用FailOver。
EN

Stack Overflow用户
提问于 2013-09-11 14:15:14
回答 2查看 766关注 0票数 0

我想创建下面的XML。

一个父节点中有许多子节点,父节点包含与子节点相关的节点(作为子节点的默认节点),如果子节点丢失了一个节点,则父节点将成为故障转移,并将其默认节点提供给kis。

代码语言:javascript
复制
<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父进程是孩子的故障转移,以防子进程遗漏了什么?

EN

回答 2

Stack Overflow用户

发布于 2013-09-11 15:44:31

不- XmlReader将按原样读取您的XML,没有“注释”的概念。如果您使用的是System.Xml.Linq而不是XmlReader,这将非常简单:

代码语言:javascript
复制
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);
票数 0
EN

Stack Overflow用户

发布于 2013-09-11 18:38:16

通过使用XmlReader,你可以解决这个需求,但是需要进行大量的检查

以下是示例代码

代码语言:javascript
复制
     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 to xml,如下所示

代码语言:javascript
复制
        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);
        }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18733905

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档