【问题标题】:Element is added in wrong place and how to add another sub-element?元素添加在错误的位置,如何添加另一个子元素?
【发布时间】:2015-10-19 12:35:04
【问题描述】:

我写了以下代码:

public static void AddUploadToXML(XDocument xdoc, int id, string fileHash, string fileName)
    {
        var singleUpload = new XElement("upload",
            new XAttribute("backupid", id),
            new XElement("file", fileHash),
            new XAttribute("filename", fileName)
            );
        xdoc.Root.Add(singleUpload);
    }

实际上我想得到这样的 XML:

<uploads>
  <upload backupid="3" >
    <file filename=""></file>
  </upload>
</uploads>

但我以这样的方式结束:

<uploads>
  <upload backupid="3" filename="">
    <file></file>
  </upload>
</uploads>

另一个问题是:

1.如何在应用程序的其他部分修改该文件名属性(它将是具有给定ID的上传元素下的第一个文件元素),

2.THEN,如何添加其他文件元素,以这样的方式完成:

<uploads>
  <upload backupid="3" >
    <file filename="Test.001">HASHCODE</file>
    <file filename="Test.002">HASHCODE2</file>
    <file filename="Test.003">HASHCODE3</file>
  </upload>
  <upload backupid="4" >
    <file filename="Test2.001">HASHCODE</file>
    (...)
  </upload>
</uploads>

【问题讨论】:

  • 为文件制作另一个 XElement。并将该元素添加到 singleUpload 元素中,
  • 我更喜欢你使用 XML 可序列化标签。为上传、文件等创建类。这很容易管理,而且是自动的,
  • 我同意@FaisalHafeez,不要做这样复杂(甚至简单)的xml。另一方面,问题的质量让我相信你在使用 xml 时遇到了困难,所以我的实际建议是在你回来攻击这个问题之前先用 xml 玩一玩。
  • 感谢您的建议!你有什么例子吗?
  • @flindeberg:我需要 xml,因为随着时间的推移,这个文件“数据库”应该包含数千条记录。是的,我对 xml 有很多头晕目眩的问题,我找不到一个简单而整洁的教程:-(

标签: c# .net xml xml-parsing


【解决方案1】:

首先你应该像这样改变你的方法:

public static void AddUploadToXML(XDocument xdoc, int id, string fileHash, string fileName)
    {
        var singleUpload = new XElement("upload",
            new XAttribute("backupid", id),
            new XElement("file", fileHash,
                new XAttribute("filename", fileName))
            );
        xdoc.Root.Add(singleUpload);
    }

至于第二个问题:你应该加载xml文件还是解析xml字符串

XElement.Load(file path) / XElement.Parse(xml string)

然后您需要通过 Id 找到所需的“上传”节点并添加新的“文件”节点:

    var element = singleUpload.Elements("upload").SingleOrDefault(x => x.Attribute("backupid").Value == "3");
    element.Add( new XElement("file", "123", new XAttribute("filename", "1223")));

【讨论】:

  • 感谢您的提示!你能告诉我,“元素”应该指向什么吗?为此,我一直为空。我的意思是,为什么元素必须使用“singleUpload”而不是整个 xml 文件?
  • 我修改了如下代码:var element = xdoc.Elements("upload")。 (...) 这不是它想要的。我应该以某种方式提供根路径吗?
  • 我在您的示例中使用了“singleUpload”名称,在我的例子中,它的 XElement 是从 xml 文件或字符串加载的。您能告诉我在尝试使用示例中的代码时遇到什么异常吗?如果您的 xml 结构与您在第一篇文章中定义的相同 - 一切都应该可以正常工作。
  • 我不想将该部分提供给其他方法。这样的行似乎有什么问题: xdoc.Elements("upload").SingleOrDefault(x => x.Attribute("backupid").Value.Equals(lastUsedID)); ?
【解决方案2】:

你需要一个这样的数组对象[]

public static void AddUploadToXML(XDocument xdoc, int id, string fileHash, string fileName)
        {
            var singleUpload = new XElement("upload", new object[] {
                new XAttribute("backupid", id),
                new XElement("file", new object[] {new XAttribute("filename", fileName), fileHash})
            });
            xdoc.Root.Add(singleUpload);

        }

【讨论】:

    猜你喜欢
    • 2011-01-15
    • 2021-05-13
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    • 2019-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多