C# 元素添加到错误的位置,如何添加另一个子元素?

C# 元素添加到错误的位置,如何添加另一个子元素?,c#,.net,xml,xml-parsing,C#,.net,Xml,Xml Parsing,我编写了以下代码: 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),

我编写了以下代码:

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>
<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>
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);
    }

但我最后说了这样的话:

<uploads>
  <upload backupid="3" >
    <file filename=""></file>
  </upload>
</uploads>
<uploads>
  <upload backupid="3" filename="">
    <file></file>
  </upload>
</uploads>
<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>
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);
    }

另一个问题是:

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

2.然后,如何添加其他文件元素,以完成如下操作:

<uploads>
  <upload backupid="3" >
    <file filename=""></file>
  </upload>
</uploads>
<uploads>
  <upload backupid="3" filename="">
    <file></file>
  </upload>
</uploads>
<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>
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);
    }

哈希码
哈希代码2
哈希代码3
哈希码
(...)

您需要这样的数组对象[]

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);

        }

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

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);

        }

首先,您应该将方法更改为smth,如下所示:

<uploads>
  <upload backupid="3" >
    <file filename=""></file>
  </upload>
</uploads>
<uploads>
  <upload backupid="3" filename="">
    <file></file>
  </upload>
</uploads>
<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>
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查找所需的“上载”节点,并添加新的“文件”节点:


首先,您应该将方法更改为smth,如下所示:

<uploads>
  <upload backupid="3" >
    <file filename=""></file>
  </upload>
</uploads>
<uploads>
  <upload backupid="3" filename="">
    <file></file>
  </upload>
</uploads>
<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>
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查找所需的“上载”节点,并添加新的“文件”节点:


为文件制作另一个XElement。在singleUpload元素中添加该元素,我更希望您使用XML可序列化标记。为上传、文件等创建易于管理、自动的类,我同意@FaisalHafeez的观点,不要这样做复杂(甚至简单)的xml。另一方面,这个问题的质量让我相信您很难使用xml,因此我的实际建议是,在您回来解决这个问题之前,先用xml做点手脚。谢谢您的想法!你有这样的例子吗?@flindeberg:我需要xml,因为随着时间的推移,这个文件“数据库”应该由数千条记录组成。是的,我对xml有很多令人眩晕的问题,我找不到一个简单而简洁的教程:-(为文件创建另一个XElement。并将该元素添加到singleUpload元素中,我更希望您使用XML可序列化标记。为上传、文件等创建类。这很容易管理,而且是自动的,我同意@FaisalHafeez的观点,不需要做复杂的(甚至是简单的)xml是这样的。另一方面,这个问题的质量让我相信你很难使用xml,所以我的实际建议是,在你回来解决这个问题之前,先在xml上玩一玩。谢谢你的想法!你有没有这样的例子?@flindeberg:我需要xml,因为随着时间的推移,这个问题已经解决了文件的“数据库”应该由数千条记录组成。是的,我在xml方面有很多令人眩晕的问题,我找不到一个简单而简洁的教程:-(谢谢你的提示!你能告诉我,“元素”应该指向什么吗?我一直在为此设置空值。我的意思是,为什么元素必须要使用“singleUpload”呢“而不是整个xml文件?我修改了一段代码,有点像这样:var element=xdoc.Elements(“上传”)。(…),它不是它要找的。我应该提供根路径吗?我使用了“singleUpload”示例中的名称,在我的示例中是从xml文件或字符串加载的XElement。您能告诉我在尝试使用示例中的代码时遇到了什么异常情况吗?如果您的xml结构与您在第一篇文章中定义的相同,则所有这些都可以正常工作。我不想将该部分提供给其他方法。这样的方法似乎有什么问题行:xdoc.Elements(“upload”).SingleOrDefault(x=>x.Attribute(“backupid”).Value.Equals(lastUsedID));?谢谢你的提示!你能告诉我,“element”应该指向什么吗?我一直在为此设置null。我的意思是,为什么element必须与“singleUpload”做一些事情而不是整个xml文件?我修改了一段代码,有点像这样:var element=xdoc.Elements(“上传”)。(…),它不是它所要的。我应该提供根路径吗?我使用了“singleUpload”示例中的名称,在我的示例中是从xml文件或字符串加载的XElement。您能告诉我在尝试使用示例中的代码时遇到了什么异常情况吗?如果您的xml结构与您在第一篇文章中定义的相同,则所有这些都可以正常工作。我不想将该部分提供给其他方法。这样的方法似乎有什么问题行:xdoc.Elements(“upload”).SingleOrDefault(x=>x.Attribute(“backupid”).Value.Equals(lastUsedID))?