使用 C# 编辑 XML 文档

2024-05-14

我在解决如何将元素添加到 XML 文档中时遇到了一些麻烦, 我想将热点信息添加到 xml 中,其中 Id 正确(因此 id=2 添加热点信息),这是我当前的 XML -

  <Pages>
    <Page>
      <Id>1</Id>
      <Title>TEST</Title>
      <ContentUrl>Images\testimg.png</ContentUrl>
      <Hotspots>
        <Hotspot>
          <X>140</X>
          <Y>202</Y>
          <Shape>Circle</Shape>
          <TargetId>2</TargetId>
        </Hotspot>
      </Hotspots>
      <ParentId>0</ParentId>
    </Page>
    <Page>
      <Id>2</Id>
      <Title>TEST2</Title>
      <ContentUrl>Images\testimg2.jpg</ContentUrl>
      <Hotspots>
      </Hotspots>
      <ParentId>1</ParentId>
    </Page>
</Pages>

我希望更新 xml,以便它显示类似这样的内容 -

<Pages>
        <Page>
          <Id>1</Id>
          <Title>TEST</Title>
          <ContentUrl>Images\testimg.png</ContentUrl>
          <Hotspots>
            <Hotspot>
              <X>140</X>
              <Y>202</Y>
              <Shape>Circle</Shape>
              <TargetId>2</TargetId>
            </Hotspot>
          </Hotspots>
          <ParentId>0</ParentId>
        </Page>
        <Page>
          <Id>2</Id>
          <Title>TEST2</Title>
          <ContentUrl>Images\testimg2.jpg</ContentUrl>
          <Hotspots>
            <Hotspot>
              <X>140</X>
              <Y>202</Y>
              <Shape>Circle</Shape>
              <TargetId>2</TargetId>
            </Hotspot>
          </Hotspots>
          <ParentId>1</ParentId>
        </Page>

我到目前为止的代码是 -

XDocument Xdoc = XDocument.Load(@"Test.xml");
    Xdoc.Root.Element("Pages").Elements("Page").Where(Page => Page.Value.Substring(0,Page.Value.IndexOf("-"))==CurrentPage.Id.ToString())
    .FirstOrDefault()
    .Add(new XElement("Hotspot",
                       new XElement("X", x), 
                       new XElement("Y", y),
                       new XElement("Shape", "Circle"),
                       new XElement("TargetId", nNodeID)
                    ));
    Xdoc.Save(@"Test.xml");

(CurrentPage.Id 是我想要与 XML 文档匹配的 id,以便在何处添加热点 - Page.Value.IndexOf("-") 返回 xml 中页面的 Id)

但这只是在页面底部添加代码,因此我需要找到一种方法将其添加到 XML 的热点部分,其中正确的 Id 所在。

任何帮助将不胜感激,如果有更好的方法来做我正在尝试的事情,请告诉我,我以前从未在代码中实际使用过 XML 文档,并且最近才开始学习 C#(上个月内)。

thanks.


选择您需要的页面

XDocument xdoc = XDocument.Load("Test.xml");
int pageId = 2;
var page = xdoc.Descendants("Page")
                .FirstOrDefault(p => (int)p.Element("Id") == pageId);

然后将内容添加到此页面元素(如果有):

if (page != null)
{
    // add to Hotspots element
    page.Element("Hotspots")
        .Add(new XElement("Hotspot",
                 new XElement("X", x),
                 new XElement("Y", y),
                 new XElement("Shape", "Circle"),
                 new XElement("TargetId", nNodeID)));

    xdoc.Save("Test.xml");
}

您的代码将新的 Hotspot 元素添加到页面,而不是将内容添加到现有的 Hotspots 元素。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 C# 编辑 XML 文档 的相关文章

  • 在 LINQ 查询中进行转换

    是否可以在 LINQ 查询中进行强制转换 为了编译器的缘故 下面的代码并不糟糕 但最好将其放入一个查询中 Content content dataStore RootControl as Controls Content List
  • 我担心我添加了太多接口

    我正在构建我的领域模型并继续重构它 正如我所做的那样 我发现我喜欢接口 因为它允许我根据接口为具体类型创建可重用的方法 控制器 视图 但是 我发现每次向域实体之一添加新属性时 我都会创建一个接口 例如 我有一个会员状态从抽象继承的对象Ent
  • 如何在 C# 中以编程方式将行添加到 DataGrid?

    正如标题所述 我正在尝试使用 C 以编程方式将行添加到 DataGrid 但我似乎无法使其工作 这是我到目前为止所拥有的 I have a DataGrid declared as dg in the XAML foreach string
  • Windows Phone 7 - ScrollViewer 值已更改

    我一直在寻找解决方案 但无法找到正确的解决方案 我的网格宽度为 960 并且有ScrollViewer在里面 现在我想知道滚动时滚动的值 水平偏移 我找到的所有解决方案都是针对 wpf silverlight 的 它对我不起作用 Edit
  • 在 C# 中解析 JS Date.toIsoString

    我需要将 JS 日期存储为 ISO 8601 日期 我目前正在从格式为 2019 06 22T00 00 00 000Z 的表单中获取日期 正如 JS 的 toIsoString 方法所期望的那样 当这个日期传递到我的 API 控制器时 我
  • 维护 VS Test Project 中单元测试方法之间的上下文

    我想按顺序运行以下单元测试 使用随机数字的名称 密码等创建新客户 检索刚刚创建的客户并断言其属性包含相同的随机数 对同一用户调用 ForgotPassword 函数 并使用相同的随机数作为用户名 清楚地看到 我需要生成一次随机数 并在 3
  • 用于 C++ 中图像分析的 OpenCV 二进制图像掩模

    我正在尝试分析一些图像 这些图像的外部周围有很多噪声 但内部有一个清晰的圆形中心 中心是我感兴趣的部分 但外部噪声正在影响我对图像的二进制阈值处理 为了忽略噪音 我尝试设置一个已知中心位置和半径的圆形蒙版 从而使该圆之外的所有像素都更改为黑
  • DateTime.ParseExact - 为什么 yy 变成 2015 而不是 1915

    为什么 NET 假定以下年份是 2015 年 而不是 1915 年 var d DateTime ParseExact 20 11 15 dd MM yy new CultureInfo en GB 我想 它会尝试接近 但其背后是否有合理的
  • 当我尝试传递临时地址作为参数时,它是一个 UB 吗?

    对于以下 C 代码 include
  • 更改私有模块片段是否会导致模块重新编译?

    On 此页面有关 C 20 模块功能 https www modernescpp com index php c 20 modules private module fragment and header units 我发现了这样的说法 借
  • 使用任一默认捕获模式时,这是通过复制捕获还是 (*this) 通过引用捕获?是一样的吗?

    当我看到以下工作时我有点困惑 struct A void g void f g 但后来我发现this https stackoverflow com a 16323119 5825294答案非常详细地解释了它是如何工作的 本质上 它归结为t
  • main.cpp 是必需的吗?

    我试图编译一个程序cmake 我最终删除了我的main cpp文件 我刚刚将其复合到另一个包含我的项目名称的文件中 即 我刚刚将主函数剪切并粘贴到该文件中 问题是我有一个main cpp未发现错误 不确定是否在C 一个名为main cpp是
  • MINIX内部碎片2

    我正在用 C 语言编写一些软件 它递归地列出给定目录中的所有文件 现在我需要计算出内部碎片 我花了很长时间研究这个问题 发现 ext2 上的内部碎片只发生在最后一个块中 我知道理论上你应该能够从索引节点号获得第一个和最后一个块地址 但我不知
  • fgets溢出后如何清除输入缓冲区?

    当输入字符串超出其预定义限制时 我遇到了 fgets 的小问题 以下面的例子为例 for index 0 index lt max index printf Enter the d string index 1 if fgets input
  • 为什么这个位图图像在加载后会改变大小?

    快速提问 我有这个1000 1000位图图像 我使用这个例程来加载它 private BitmapSource initialBitmap new BitmapImage new Uri C Users Desktop Original b
  • 如何在VS2005中使用从.bat而不是.exe启动的外部程序进行调试?

    在我的 c 项目的调试属性中 我选择了 启动外部程序 并选择了我希望将调试器附加到的程序的 exe 但是 现在我需要从 bat 文件而不是 exe 启动程序 但 VS2005 似乎不允许这样做 这可能吗 编辑 为了澄清 我需要调试从 bat
  • 使用未命名命名空间而不是静态命名空间

    我可以假设在未命名命名空间中声明的对象相当于static namespace int x 1 static int x 2 FWIK 在这两种情况下 x将具有静态存储期限和内部链接 声明为的对象的所有规则也是如此static适用于未命名名称
  • 如何防止 Lotus Notes 用户转发或复制通过 System.Net.Mail 发送的邮件?

    我想使用 SMTP 客户端 uiing microsft net 以 C 作为编程语言发送电子邮件 但是对于通过SMTP客户端发送的电子邮件 我们是否可以添加 禁止转发 或 禁止复制 等安全功能 我不希望电子邮件的收件人转发或复制电子邮件的
  • 在多线程环境中捕获信号

    我有一个大型程序 需要尽可能具有弹性 并且有大量线程 我需要捕获所有信号SIGBUS SIGSEGV 并在必要时重新初始化有问题的线程 或者禁用该线程以继续减少功能 我的第一个想法是做一个setjump 然后设置信号处理程序 可以记录问题
  • 异步/等待 - 是*并发*吗?

    我一直在考虑 C 5 中新的异步内容 并且出现了一个特殊问题 据我了解 await关键字是一个简洁的编译器技巧 语法糖来实现连续传递 http en wikipedia org wiki Continuation passing style

随机推荐