【问题标题】:Adding elements to elements in XDocument向 XDocument 中的元素添加元素
【发布时间】:2013-11-04 13:17:14
【问题描述】:

我一直在编写一个使用 XML 的数据库程序。每当程序启动并没有在指定的路径找到 XML 文件时,它就会生成:

<!--  Studnet Database  -->
<schoolDB>
    <Grades>
        <Grade10/>
        <Grade11/>
        <Grade12/>
    </Grades>
    <Employees/>
</schoolDB>

我希望程序在 Grade* 元素中添加一个名为 studentelement(系统会提示用户输入从 10 到 12 的等级,然后将其解析为 Grade10 -> Grade12)。我是这样写的:

    XDocument doc = XDocument.Load(prog.dbFile);
    doc.Element(toWriteGrade).Add(new XElement("student",
            new XElement("name", name),
            new XElement("age", age)));
    doc.Save(prog.dbFile);

当我运行它时,它给了我一个错误:

StudentClone1.exe 中出现“System.NullReferenceException”类型的未处理异常 附加信息:对象引用未设置为 目的。

这里有什么问题?

【问题讨论】:

    标签: c# xml linq linq-to-xml


    【解决方案1】:

    这意味着您没有正确选择成绩元素:

    doc.Element(toWriteGrade) // this returns null
    

    因此等级是Grades元素的元素,你应该这样查询它:

    doc.Root.Element("Grades").Element(toWriteGrade)
    

    或者(效率较低)您可以只查看文件中的所有元素:

    doc.Descendants(toWriteGrade) 
    

    【讨论】:

    • 我认为Root 会将其写入schoolDB 元素,但我想不会。感谢您的快速回复!
    • @Ilan321 node.Element 方法只检查节点的直接子节点。这就是为什么你找不到 Grade 元素 - 它在 doc direct children 中不存在(只能在那里找到根元素)
    • 顺便说一句,我建议您使用一些idvalue 属性来指定成绩,而不是更改成绩元素的名称。 IE。而不是 &lt;Grade10&gt; 使用 &lt;Grade id='10/&gt; 这将使查询更容易
    猜你喜欢
    • 1970-01-01
    • 2016-08-27
    • 1970-01-01
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-20
    • 2021-09-28
    相关资源
    最近更新 更多