2014-08-29 65 views
0

我有这样的XML文件中:做这个添加重复元素的XML文件

<root> 
    <Friend_2> 
    <MESSAGE_BODY>hi</MESSAGE_BODY> 
    <MESSAGE_SENDER_ID>1</MESSAGE_SENDER_ID> 
    <MESSAGE_RECEIVER_ID>2</MESSAGE_RECEIVER_ID> 
    <MESSAGE_CREATION_DATE>2014-08-29T15:33:18.1191004+03:00</MESSAGE_CREATION_DATE> 
    </Friend_2> 
</root> 

我使用这个功能,将元素添加到该文件:

private void createNode(string body, string senderid, string receiverid,DateTime creationDate,string path1,string path2) 
{ 
    XDocument doc1 = XDocument.Load(path1); 
    XDocument doc2 = XDocument.Load(path2); 
    XElement root1 = new XElement("Friend_"+receiverid); 
    XElement root2 = new XElement("Friend_"+senderid); 

    root1.Add(new XElement("MESSAGE_BODY", body)); 
    root1.Add(new XElement("MESSAGE_SENDER_ID", senderid)); 
    root1.Add(new XElement("MESSAGE_RECEIVER_ID", receiverid)); 
    root1.Add(new XElement("MESSAGE_CREATION_DATE", creationDate)); 


    root2.Add(new XElement("MESSAGE_BODY", body)); 
    root2.Add(new XElement("MESSAGE_SENDER_ID", senderid)); 
    root2.Add(new XElement("MESSAGE_RECEIVER_ID", receiverid)); 
    root2.Add(new XElement("MESSAGE_CREATION_DATE", creationDate)); 

    if (doc1.Root.Element(root1.Name.LocalName) == null) 
    { 
     doc1.Element("root").Add(root1); 
    } 

    if (doc2.Root.Element(root2.Name.LocalName) == null) 
    { 
     doc2.Element("root").Add(root2); 
    } 

    doc1.Save(path1); 
    doc2.Save(path2); 
} 

但原来的元素被替换。我希望我的XML文件是这样的:

<root> 
    <Friend_2> 
    <MESSAGE_BODY>hi</MESSAGE_BODY> 
    <MESSAGE_SENDER_ID>1</MESSAGE_SENDER_ID> 
    <MESSAGE_RECEIVER_ID>2</MESSAGE_RECEIVER_ID> 
    <MESSAGE_CREATION_DATE>2014-08-29T15:33:18.1191004+03:00</MESSAGE_CREATION_DATE> 
    <MESSAGE_BODY>how r you ?</MESSAGE_BODY> 
    <MESSAGE_SENDER_ID>1</MESSAGE_SENDER_ID> 
    <MESSAGE_RECEIVER_ID>2</MESSAGE_RECEIVER_ID> 
    <MESSAGE_CREATION_DATE>2014-10-29T15:33:18.1191004+03:00</MESSAGE_CREATION_DATE> 
    </Friend_2> 
</root> 

我的主要理由,这个模式是因为我使用的解析文档,并返回一个包含4列和2行

public static DataSet ConvertXMLToDataTable(string xmlString) 
{ 
    DataSet dataset = new DataSet(); 
    dataset.ReadXml(xmlString); 
    return dataset.Tables.Count > 0 ? dataset : null; 
} 

DataSet Chat_ds=Convertor.ConvertXMLToDataTable(path); 
      if (Chat_ds.Tables.Count > 0) 
      { 
       DataTable Chat_dt = Chat_ds.Tables["Friend_" + FriendID]; 

................... 
一个DataTable的功能

我不能让我的XML看起来像这样:

<root> 
    <Friend_2> 
    <message> 
    <MESSAGE_BODY>hi</MESSAGE_BODY> 
    <MESSAGE_SENDER_ID>1</MESSAGE_SENDER_ID> 
    <MESSAGE_RECEIVER_ID>2</MESSAGE_RECEIVER_ID> 
    <MESSAGE_CREATION_DATE>2014-08-29T15:33:18.1191004+03:00</MESSAGE_CREATION_DATE> 
    </message> 

    <message> 
    <MESSAGE_BODY>how r you ?</MESSAGE_BODY> 
    <MESSAGE_SENDER_ID>1</MESSAGE_SENDER_ID> 
    <MESSAGE_RECEIVER_ID>2</MESSAGE_RECEIVER_ID> 
    <MESSAGE_CREATION_DATE>2014-10-29T15:33:18.1191004+03:00</MESSAGE_CREATION_DATE> 
    </message> 

    </Friend_2> 
    </root> 
+0

如果我明白,你实际上是重新创建Friend_2节点,所以是的,我希望它的内容被“替换”。 – Kilazur 2014-08-29 13:15:09

+0

我该如何解决这个问题? – Sora 2014-08-29 13:20:31

回答

1

考虑做一些检查您Friend_n节点的存在。现在,你只需创建一个全新的Friend_n节点,所以旧内容不存在了。

private void createNode(string body, string senderid, string receiverid,DateTime creationDate,string path1,string path2) 
{ 
    XDocument doc1 = XDocument.Load(path1); 
    XDocument doc2 = XDocument.Load(path2); 

    string receiver = "Friend_"+receiverid; 
    string sender = "Friend_"+senderid; 
    XElement root1 = doc1.Element(receiver); 
    if (root1 == null) 
    { 
     root1 = new XElement(receiver); 
     doc1.Root.Add(root1); 
    } 
    XElement root2 = doc1.Element(sender); 
    if (root2 == null) 
    { 
     root2 = new XElement(sender); 
     doc2.Root.Add(root2); 
    } 

    root1.Add(new XElement("MESSAGE_BODY", body)); 
    root1.Add(new XElement("MESSAGE_SENDER_ID", senderid)); 
    root1.Add(new XElement("MESSAGE_RECEIVER_ID", receiverid)); 
    root1.Add(new XElement("MESSAGE_CREATION_DATE", creationDate)); 

    root2.Add(new XElement("MESSAGE_BODY", body)); 
    root2.Add(new XElement("MESSAGE_SENDER_ID", senderid)); 
    root2.Add(new XElement("MESSAGE_RECEIVER_ID", receiverid)); 
    root2.Add(new XElement("MESSAGE_CREATION_DATE", creationDate)); 

    doc1.Save(path1); 
    doc2.Save(path2); 
} 
+0

注意:这主要是由内存完成的,所以它可能无法正常工作。如果是这种情况,我会尽力解决,但重要的部分是开始时的检查。 – Kilazur 2014-08-29 13:24:39

+0

我有一个例外'此操作将在此行'doc1.Add(目录root1)创建一个不正确的结构document';' – Sora 2014-08-29 13:29:31

+0

我替换它:'doc1.Root.Add(目录root1)'和现在一切是确定 – Sora 2014-08-29 13:36:16