【问题标题】:Adding xml tag via code通过代码添加 xml 标签
【发布时间】:2011-08-27 15:33:56
【问题描述】:

我正在用 C# 编写一个应用程序。我已经是一个非空的 .xml 文件,我想向其中添加新值,而不删除现有值。

我试过这段代码:

第一:

FileStream docNewUser = new FileStream(@"C:\\MyApp\\MySubDir\\Data\\" + pr + ".xml", FileMode.Open);
XmlTextWriter xmlNewUser = new XmlTextWriter(docNewUser, null);
xmlNewUser.WriteStartDocument();

xmlNewUser.WriteStartElement("RootEl");//root 

xmlNewUser.WriteStartElement("Zapis");

xmlNewUser.WriteStartElement("Name");
xmlNewUser.WriteString(txtEnterName.Text);
xmlNewUser.WriteEndElement();

xmlNewUser.WriteEndElement();//end of zapis                

this.Close();

第二:

FileStream docNewUser = new FileStream(@"C:\\MyApp\\MySubDir\\Data\\" + pr + ".xml", FileMode.Open);
XmlTextWriter xmlNewUser = new XmlTextWriter(docNewUser, null);
xmlNewUser.WriteStartDocument();

xmlNewUser.WriteStartElement("RootEl");//root-ot

xmlNewUser.WriteStartElement("Zapis");

xmlNewUser.WriteStartElement("Name");
xmlNewUser.WriteString(txtEnterName.Text);
xmlNewUser.WriteEndElement();

xmlNewUser.WriteEndElement();//end of zapis                

xmlNewUser.WriteElementString("Ime", null, txtEnterName.Text);

this.Close();

第三:

FileStream docNewUser = new FileStream(@"C:\\MyApp\\MySubDir\\Data\\" + pr + ".xml", FileMode.Open);
XmlTextWriter xmlNewUser = new XmlTextWriter(docNewUser, null);
xmlNewUser.WriteStartDocument();

xmlNewUser.WriteStartElement("Zapis");

xmlNewUser.WriteStartElement("Name");
xmlNewUser.WriteString(txtEnterName.Text);
xmlNewUser.WriteEndElement();

xmlNewUser.WriteEndElement();//end of zapis                

xmlNewUser.WriteElementString("Ime", null, txtEnterName.Text);

this.Close();

我认为问题在于流不知道将新值放在哪里。 更多信息:已经输入了根元素。

【问题讨论】:

    标签: c# xml stream


    【解决方案1】:

    如果您的 .NET 版本支持,请使用 LINQ to XML。 (警告:我不是专家,可能有更优雅的方式来写这个。)

    // Without error handling
    var root = XElement.Load(@"C:\Users\TrueWill\Downloads\Foo.xml");
    
    var product =
        (from item in root.Elements("item")
        where item.Element("name").Value == "Product1"
        select item)
        .Single();
    
    product.Add(new XElement("size", "small"));
    
    root.Save(@"C:\Users\TrueWill\Downloads\FooCopy.xml");
    

    我的测试文件(之前):

    <?xml version="1.0" encoding="utf-8"?>
    <test>
    <item><name>Product1</name></item>
    <item><name>Product2</name></item>
    </test>
    

    我的测试文件副本(之后)(我是复制而不是替换):

    <?xml version="1.0" encoding="utf-8"?>
    <test>
      <item>
        <name>Product1</name>
        <size>small</size>
      </item>
      <item>
        <name>Product2</name>
      </item>
    </test>
    

    【讨论】:

      【解决方案2】:

      当您以这种方式将 XML 写入文件时,它总是会覆盖文件中之前的内容。如果您想使用XmlTextWriter 对其进行写入,则必须先复制当前内容,然后将新元素写入正确的位置。不要忘记您不能同时读取和写入同一个文件,因此您必须使用临时文件并用它覆盖原始文件。或者您首先将整个文件读入一个字符串。或者先把你的结果写成一个字符串。

      但更好的解决方案可能是使用XDocument(或XmlDocument)加载整个文档,对其进行修改然后保存。 (如果 XML 文件很大,这样做不是一个好主意。)

      【讨论】:

        【解决方案3】:

        使用 XmlDocument:

        XmlDocument doc = new XmlDocument();
        doc.Load("filepath");
        XmlNode node = doc["MainNode"]["subnode1"]["subnode2"]; //to fetch the node after which you'd like to add something.
        XmlElement stuffToAdd = doc.CreateNode("nodename");
        stuffToAdd.InnerText = "the value of your added node";
        node.AddChild(stuffToAdd);
        doc.Save("filepath");
        

        我是在内存不足的情况下这样做的,所以方法的名称是近似的。

        正如另一个答案中所说,使用 XmlElement 加载大型 XML 文件可能会很昂贵,因为当您调用 Load() 时它已完全加载到内存中。

        【讨论】:

        • 这真的很有帮助。非常感谢:)
        【解决方案4】:

        您使用 XmlTextWriter 有什么原因吗?我发现LINQ to XML 替代方案要容易得多。

        您的代码如下所示;

        XElement el = new XElement("Zapis");
        el.Add(new XElement("Name",txtEnterName.Text))
        el.Save(@"C:\\MyApp\\MySubDir\\Data\\" + pr + ".xml")
        

        【讨论】:

        • 这在 .xml 文件中写入了新元素,但删除了其他所有内容。
        • 如果你想加载那里的内容,请使用 var existingEls= XElement.Load(filename) 然后使用 existingEls.Add()
        猜你喜欢
        • 1970-01-01
        • 2017-06-05
        • 1970-01-01
        • 1970-01-01
        • 2013-11-30
        • 1970-01-01
        • 1970-01-01
        • 2019-03-26
        • 1970-01-01
        相关资源
        最近更新 更多