C#、XML、添加新节点

2024-01-19

我正在尝试向现有 XML 文件添加新节点。 我有这个文件,其中包含第一个测试元素:

 <?xml version="1.0" encoding="utf-8"?>
<Root xmlns="http://prpa.org/XMLSchema1.xsd">
  <studenti>
    <student>
      <ime>test</ime>
      <prezime>test</prezime>
      <ocijena>0</ocijena>
    </student>
  </studenti>
  <profesori>
    <profesor>
      <ime>test</ime>
      <prezime>test</prezime>
    </profesor>
  </profesori>
</Root>

我使用这个模式来生成这个 XML 文档

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="XMLSchema1"
    targetNamespace="http://prpa.org/XMLSchema1.xsd"
    elementFormDefault="qualified"
    xmlns="http://prpa.org/XMLSchema1.xsd"
    xmlns:mstns="http://prpa.org/XMLSchema1.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
           >
  <xs:element name='Root'>
    <xs:complexType>
      <xs:sequence>

  <xs:element name="studenti">
    <xs:complexType>
      <xs:sequence>       
   <xs:element name="student">
     <xs:complexType>
      <xs:sequence>
        <xs:element name="ime" type="xs:string"/>
        <xs:element name="prezime" type="xs:string"/>
        <xs:element name="ocijena" type="xs:int"/>
     </xs:sequence>
    </xs:complexType>
  </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:element name="profesori">
    <xs:complexType>
      <xs:sequence>
  <xs:element name="profesor">
      <xs:complexType>
        <xs:sequence>
         <xs:element name="ime" type="xs:string"/>
         <xs:element name="prezime" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>
  </xs:sequence>
  </xs:complexType>
  </xs:element>

      </xs:sequence>
    </xs:complexType>
  </xs:element>

</xs:schema>

现在,我需要添加新节点

 <profesor>
      <ime>test2</ime>
      <prezime>test2</prezime>
    </profesor>

到目前为止我已经尝试过了:

XmlDocument xmldoc = new XmlDocument();
        xmldoc.Load(Server.MapPath("data/sve.xml"));
        XmlNode root = xmldoc.SelectSingleNode("root/profesori", null);

            XmlNode prof = xmldoc.CreateNode(XmlNodeType.Element, "profesor", null);

            XmlNode ime = xmldoc.CreateNode(XmlNodeType.Element, "ime", null);
            ime.InnerText = name;
            prof.AppendChild(ime);

            XmlNode prezime = xmldoc.CreateNode(XmlNodeType.Element, "prezime", null);
            prezime.InnerText = surname;
            prof.AppendChild(prezime);

             root.AppendChild(prof);

            xmldoc.Save(Server.MapPath("data/sve.xml"));

我还尝试向其中添加名称空间管理器:

XmlNamespaceManager nsMgr = new XmlNamespaceManager(xmldoc.NameTable);
                nsMgr.AddNamespace("ns", xmldoc.NamespaceURI);
XmlNode root = xmldoc.SelectSingleNode("/ns:root/ns:profesori", nsMgr);

我仍然无法选择父节点并向其添加新的子节点。在调试模式下,“根”对象为空,无论有没有命名空间,所以最后我当然会得到一个空指针异常。

我究竟做错了什么?

附:模式、命名空间、xml 文件都是本地的并且由我编写,如果这有什么区别的话......


您的第一个问题是 XPath 中的节点名称与 XML 中的节点名称不匹配。 XML 区分大小写,因此您需要使用Root, not root:

XmlNode root = xmldoc.SelectSingleNode("/ns:Root/ns:profesori", nsMgr);

接下来,代替xmldoc.NamespaceURI,使用实际的命名空间 uri:

string strNamespace= "http://prpa.org/XMLSchema1.xsd";
nsMgr.AddNamespace("ns", strNamespace);

或者这样做:

string strNamespace= xmldoc.DocumentElement.NamespaceURI;
nsMgr.AddNamespace("ns", strNamespace);

的命名空间 URIXmlDocument对象将始终是一个空字符串。

创建元素时还应该使用此名称空间:

XmlNode prof = xmldoc.CreateNode(XmlNodeType.Element, "profesor", strNamespace);

XmlNode ime = xmldoc.CreateNode(XmlNodeType.Element, "ime", strNamespace);
ime.InnerText = name;
prof.AppendChild(ime);

XmlNode prezime = xmldoc.CreateNode(XmlNodeType.Element, "prezime", strNamespace);
prezime.InnerText = surname;
prof.AppendChild(prezime);

root.AppendChild(prof);

您也可以考虑使用CreateElement()方法,会稍微短一些:

XmlNode prof = xmldoc.CreateElement("profesor", strNamespace);

或者,我更喜欢使用 XmlWriter:

using(XmlWriter writer = root.CreateNavigator().AppendChild())
{
    writer.WriteStartElement("profesor", strNamespace);
    writer.WriteElementString("ime", strNamespace, name);
    writer.WriteElementString("prezime", strNamespace, surname);
    writer.WriteEndElement();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C#、XML、添加新节点 的相关文章

随机推荐

  • Python 3.5.1 - 将同一输入行上的多个整数读取到列表中

    我正在使用 python 3 5 1 并通过 Windows 上的命令提示符运行我的文件 参数在程序运行后传递 即程序根据先前生成的列表提示输入 我希望在同一行上读取多个数字 并用空格分隔 Python 2 X 中 raw input 不会
  • adb logcat -f log.txt 错误:无法打开输出文件:只读文件系统

    在 Windows win7 上 通过 USB 调试真实手机 我想将 logcat 日志转储到我的 PC 上的文件中 数据速率超出了 Eclipse 的可用范围 我想要整个未过滤的日志 根据logcat 命令行说明 http develop
  • 让 IAlert 作为观察者

    我正在使用最后的硒 一些网站会随机弹出消息 停止正常的测试过程 我的想法是 我需要将 IAlert 作为观察者模式来捕获警报 接受警报并从其停止处理弹出窗口的点继续测试 警报代码 try IAlert alert driver Switch
  • 在 Java 中检测流是否被压缩的最佳方法

    找出我的最佳方法是什么java io InputStream包含压缩数据 介绍 由于所有答案都是 5 年前的 我觉得有责任写下今天发生的事情 我严重怀疑是否应该读取流的魔术字节 这是一个低级代码 通常应该避免 简单回答 米库写道 如果可以通
  • Python 替换未知结构 JSON 文件中的值

    假设我有一个 JSON 文件 其结构要么未知 要么可能会随着时间的推移而改变 我想用我在 Python 中选择的字符串替换 REPLACE ME 的所有值 我发现的一切都假设我知道其结构 例如 我可以读取 JSONjson load遍历字典
  • 在插入符中访问 rfe 生成的所有模型

    我正在使用rfecaret 包中的函数用于逻辑回归模型的特征选择 我正在看sizes5 10 15 20 和 25 使用 Rsquared 选择最佳模型 我的因变量是 0 1 有没有办法访问该公司生产的其他模型rfe功能超出最终选定的模型
  • 使用桌面应用程序部署 SQL Server Express 数据库?

    我已经在 NET 中创建了第一个基于数据库的桌面应用程序 但无法理解如何使用应用程序安装程序部署数据库 以便一次性安装数据库 应用程序和 SQL Server 如果我只使用安装程序部署 SQL Server 的本机客户端和数据库 它会起作用
  • mysql查询结果在php变量中

    有没有办法将mysql结果存储在php变量中 谢谢 query SELECT username userid FROM user WHERE username admin result conn gt query query 然后我想打印从
  • 如何在 Django 中制作类似于 stackoverflow 的 URL?

    我正在创建一个视频网站 我希望视频的直接网址看起来像 example com watch this is a slug 1 其中 1 是视频 ID 但我不想让蛞蝓变得重要 example com watch this is another
  • MVVM 独特的优势

    stackoverflow 搜索将导致多个包含相似标题的帖子 但这是不同的问题 由于这不是一个讨论网站 我必须问一个不同的问题 使用 MVVM 可以给我带来哪些其他实现无法带来的独特好处 MVC NTiers 或其他任何东西 我并不是真正在
  • C# 如何将 System.Net.ConnectStream 转换为 byte[] (数组)

    我正在尝试将流 System Net ConnectStream 转换为字节数组 关于如何做到这一点的任何想法 示例 Stream sourceStream the ConnectStream byte array using var ms
  • 如何在 REST Assured 中设置请求超时?

    我正在发送带有 REST Assured 的帖子请求 问题是它根本没有超时 就我而言 服务器有时无法访问 这会永远锁定请求 找到了答案 我将其发布在这里 希望对某人有所帮助 RestAssured config RestAssuredCon
  • 用颜色绘制 SKPhysicsBody 的形状

    使用 SpriteKit 创建游戏 效果非常好 我正在使用物理学并且能够看到我的身体实际上在哪里 因为我的精灵里面可能有一些阿尔法 这真的会很有帮助 这也将有助于创建更精确的身体 在 SpriteKit 的文档中 他们讨论了 debugOv
  • 如何将 .Net 日期时间转换为 T-SQL 日期时间

    MyDataSource SelectParameters startDate DefaultValue fromDate SelectedDate Date ToString 如您所见 我正在 Net SqlDataSource 中设置参
  • 从自定义中间件(外部身份提供商)重定向期间未传递登录 ID

    我们希望在身份服务器中有一个外部身份提供商 用户被重定向到登录到此外部身份提供商 Idp 并在那里完成身份验证 外部 Idp 将响应重定向回我们的身份服务器 我们希望在其中根据响应形成用户声明并重定向回调用客户端 我们遵循了答案这个计算器问
  • Oracle 多次更新查询

    我的数据库中有两张如下表所示的表 在每个 DEPARTMENT CODE 的第一个表 ITEM 中 将有多个 ITEM CODE ITEM STORE CODE ITEM CODE DEPARTMENT CODE 011 912003 14
  • 如何在 IntelliJ 中执行外部工具

    我在哪里可以实际启动 IntelliJ 中的外部工具 我知道在哪里设置外部工具 并且我已经完成了 但我看不到在哪里启动它 我没有从 运行 菜单中看到它 也没有从任何右键单击菜单中看到它 您可以使用 JetBrains 的命令行工具支持插件从
  • select/poll 与异步 I/O 的性能

    从性能角度来看 哪一个更好 选择 轮询还是异步 I O 我之前的印象是 select poll 反复向内核请求数据 而异步 I O 则依赖于内核通知数据可用性 但是 我注意到 select poll 也依赖于内核通知 因此 我相信从性能的角
  • 如何在Python中转义撇号等?

    我有一个带有这样的符号的字符串 39 这显然是一个撇号 我尝试了 saxutils unescape 但没有任何运气 并尝试了 urllib unquote 我怎样才能解码这个 谢谢 查看这个问题 https stackoverflow c
  • C#、XML、添加新节点

    我正在尝试向现有 XML 文件添加新节点 我有这个文件 其中包含第一个测试元素