2015-05-13 3 views
0

У меня есть XML, и я хочу, чтобы переписать его с C#, чтобы transfrom его с различными vaule, вот старый XML:Заменить значение XML с C#

<Connection ConnectionID="106359" From_PhraseID="1" To_PhraseID="tg1c8p-jgg-dbh-b4l-hir5cpla7_nl" /> 
    <Connection ConnectionID="106360" From_PhraseID="tg1c8p-jgg-dbh-b4l-hir5cpla7_nl" To_PhraseID="tg0if2-jc8-k6i-spg-2tof46ftr_nl" /> 
    <Connection ConnectionID="106361" From_PhraseID="tg1c8p-jgg-dbh-b4l-hir5cpla7_nl" To_PhraseID="4trq50-2h0-kqc-9ku-bm8f4cte7_nl" /> 
    <Connection ConnectionID="106362" From_PhraseID="tg1c8p-jgg-dbh-b4l-hir5cpla7_nl" To_PhraseID="1fpspg-tmq-7ln-a9b-3mr3962ca_nl" /> 
    <Connection ConnectionID="106358" From_PhraseID="tg0if2-jc8-k6i-spg-2tof46ftr_nl" To_PhraseID="jmrgi1-dst-kt6-roo-lrahuk6tj_nl" /> 
    <Connection ConnectionID="106373" From_PhraseID="4trq50-2h0-kqc-9ku-bm8f4cte7_nl" To_PhraseID="97bngg-ggb-k8l-ggf-qnre46ckq_nl" /> 
    <Connection ConnectionID="106376" From_PhraseID="1fpspg-tmq-7ln-a9b-3mr3962ca_nl" To_PhraseID="bqgccm-55n-iur-061-27obhegve_nl" /> 

и новый XML должен быть:

<Connection ConnectionID="106359" From_PhraseID="0" To_PhraseID="1" /> 
<Connection ConnectionID="106360" From_PhraseID="1" To_PhraseID="2" /> 
<Connection ConnectionID="106361" From_PhraseID="1" To_PhraseID="3" /> 
<Connection ConnectionID="106362" From_PhraseID="1" To_PhraseID="4" /> 
<Connection ConnectionID="106358" From_PhraseID="2" To_PhraseID="6" /> 
<Connection ConnectionID="106373" From_PhraseID="3" To_PhraseID="7" /> 
<Connection ConnectionID="106376" From_PhraseID="4" To_PhraseID="5" /> 

любая идея, как написать это в C#, у меня есть старт на здесь, этот код может загрузить старый XML получить все старое значение в C#, но как изменить значение

 public class Dialogs{ 
      public Dictionary<string, Connection> Connections = new Dictionary<string, Connection>(); 
     } 
    public class Connection 
    { 
     public string ConnectionID = null; 
     public string FromPhraseID = null; 
     public string ToPhraseID = null; 
    } 
    List<Connection> connectionsList = new List<Connection>(); 
      Dialogs resultDialog = new Dialogs(); 

      // Document 

      XmlDocument xml = new XmlDocument(); 
      TextAsset asset = (TextAsset)Resources.Load("Dialogs/online"); 
      xml.LoadXml(asset.text); 
// Connections 

     XmlNodeList connections = xml.GetElementsByTagName("Connection"); 

     foreach (XmlNode connectionNode in connections) 
     { 
      Connection connection = NodeToConnection(connectionNode); 
      connectionsList.Add(connection); 

      if (connection != null) 
      AddOrUpdateList(resultDialog.FromLists, connection); 

     } 
private Connection NodeToConnection(XmlNode node) 
    { 
     Connection connection = new Connection(); 

     connection.ConnectionID = node.Attributes["ConnectionID"].Value; 
     connection.FromPhraseID = node.Attributes["From_PhraseID"].Value; 
     connection.ToPhraseID = node.Attributes["To_PhraseID"].Value; 

     return connection; 
    } 

    private void AddOrUpdateList(Dictionary<string, List<Connection>> dic, Connection con) 
    { 
     if (dic.ContainsKey(con.FromPhraseID)) 
      dic[con.FromPhraseID].Add(con); 
     else   
      dic.Add(con.FromPhraseID, new List<Connection>(new Connection[] {con}));   
    } 

ответ

1

Попробуйте код ниже. Я использовал словарь для хранения замещающих значений

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 
using System.IO; 

namespace ConsoleApplication28 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string input = 
       "<Connection ConnectionID=\"106359\" From_PhraseID=\"1\" To_PhraseID=\"tg1c8p-jgg-dbh-b4l-hir5cpla7_nl\" />" + 
       "<Connection ConnectionID=\"106360\" From_PhraseID=\"tg1c8p-jgg-dbh-b4l-hir5cpla7_nl\" To_PhraseID=\"tg0if2-jc8-k6i-spg-2tof46ftr_nl\" />" + 
       "<Connection ConnectionID=\"106361\" From_PhraseID=\"tg1c8p-jgg-dbh-b4l-hir5cpla7_nl\" To_PhraseID=\"4trq50-2h0-kqc-9ku-bm8f4cte7_nl\" />" + 
       "<Connection ConnectionID=\"106362\" From_PhraseID=\"tg1c8p-jgg-dbh-b4l-hir5cpla7_nl\" To_PhraseID=\"1fpspg-tmq-7ln-a9b-3mr3962ca_nl\" />" + 
       "<Connection ConnectionID=\"106358\" From_PhraseID=\"tg0if2-jc8-k6i-spg-2tof46ftr_nl\" To_PhraseID=\"jmrgi1-dst-kt6-roo-lrahuk6tj_nl\" />" + 
       "<Connection ConnectionID=\"106373\" From_PhraseID=\"4trq50-2h0-kqc-9ku-bm8f4cte7_nl\" To_PhraseID=\"97bngg-ggb-k8l-ggf-qnre46ckq_nl\" />" + 
       "<Connection ConnectionID=\"106376\" From_PhraseID=\"1fpspg-tmq-7ln-a9b-3mr3962ca_nl\" To_PhraseID=\"bqgccm-55n-iur-061-27obhegve_nl\" />"; 

      input = "<Root>" + input + "</Root>"; 
      StringReader reader = new StringReader(input); 
      XDocument doc = XDocument.Load(reader); 

      int value = 1; 
      Dictionary<string, int> dict = new Dictionary<string, int>(); 
      foreach (XElement connection in doc.Root.Elements("Connection")) 
      { 
       string fromAttr = connection.Attribute("From_PhraseID").Value; 
       if (!dict.ContainsKey(fromAttr)) 
       { 
        dict.Add(fromAttr, value++); 
       } 
       string toAttr = connection.Attribute("To_PhraseID").Value; 
       if (!dict.ContainsKey(toAttr)) 
       { 
        dict.Add(toAttr, value++); 
       } 
      } 
      foreach (XElement connection in doc.Root.Elements("Connection")) 
      { 
       string fromAttr = connection.Attribute("From_PhraseID").Value; 
       connection.Attribute("From_PhraseID").Value = dict[fromAttr].ToString(); 
       string toAttr = connection.Attribute("To_PhraseID").Value; 
       connection.Attribute("To_PhraseID").Value = dict[toAttr].ToString(); 
      } 
     } 
    } 
} 
+0

Спасибо, что работает ~~~ – Eleanor

0

Использовать свойство setter?

Вы получаете значение по node.Attributes["ConnectionID"].Value, так что вы можете установить его:

node.Attributes["ConnectionID"].Value = "new value" 

Я настоятельно рекомендую использовать LINQ для XML (XDocument) вместо старого XmlDocument API, если вы можете.

В этом случае может быть даже смысл (и использовать гораздо меньше кода) для использования XmlSerializer, чтобы десериализовать XML-объекты до Connection, внести изменения и сериализовать обратно в XML.

Неясно, какова ваша перенумерующая логика. Я создал пример делать это с помощью LINQ к XML и количеству идентификаторов фразы в порядке, они видели:

public class ConnectionRenumberer 
{ 
    private List<string> phraseIds; 

    public string RenumberConnections(string xml) 
    { 
     phraseIds = new List<string>(); 

     var doc = XDocument.Parse(xml); 

     foreach (var connection in doc.Descendants("Connection")) 
     { 
      var from = connection.Attribute("From_PhraseID"); 
      from.Value = NewPhraseId(from.Value); 

      var to = connection.Attribute("To_PhraseID"); 
      to.Value = NewPhraseId(to.Value);      
     } 

     return doc.ToString(); 
    } 

    private string NewPhraseId(string value) 
    { 
     var index = phraseIds.IndexOf(value); 

     if (index == -1) 
     { 
      index = phraseIds.Count; 
      phraseIds.Add(value); 
     } 

     return index.ToString(); 
    } 
} 

Это довольно наивное решение. phraseIds будет лучше заменен, скажем, Dictionary, если входной файл xml большой.

+0

Понятно, поэтому сделайте список «нового значения», чтобы заменить их, но как я могу заменить правильный? Может, у вас есть пример? – Eleanor

+0

Это другой вопрос, связанный с логикой того, чего вы пытаетесь достичь. Вы спросили, как изменить значение;). Поскольку это должно быть довольно просто, я приведу пример с использованием LINQ to XML. –

0

Я использую LINQ to XML.

Вот образец, который будет делать то, что вы хотите для одного элемента. Я отпущу вас оттуда.

static void Main(string[] args) 
     { 
      try 
      { 
       string rootXml = "<Root><Connection ConnectionID=\"106359\" From_PhraseID=\"1\" To_PhraseID=\"tg1c8p-jgg-dbh-b4l-hir5cpla7_nl\"></Connection><Connection ConnectionID=\"106360\" From_PhraseID=\"tg1c8p-jgg-dbh-b4l-hir5cpla7_nl\" To_PhraseID=\"tg0if2-jc8-k6i-spg-2tof46ftr_nl\"></Connection><Connection ConnectionID=\"106361\" From_PhraseID=\"tg1c8p-jgg-dbh-b4l-hir5cpla7_nl\" To_PhraseID=\"4trq50-2h0-kqc-9ku-bm8f4cte7_nl\"></Connection><Connection ConnectionID=\"106362\" From_PhraseID=\"tg1c8p-jgg-dbh-b4l-hir5cpla7_nl\" To_PhraseID=\"1fpspg-tmq-7ln-a9b-3mr3962ca_nl\"></Connection><Connection ConnectionID=\"106358\" From_PhraseID=\"tg0if2-jc8-k6i-spg-2tof46ftr_nl\" To_PhraseID=\"jmrgi1-dst-kt6-roo-lrahuk6tj_nl\"></Connection><Connection ConnectionID=\"106373\" From_PhraseID=\"4trq50-2h0-kqc-9ku-bm8f4cte7_nl\" To_PhraseID=\"97bngg-ggb-k8l-ggf-qnre46ckq_nl\"></Connection><Connection ConnectionID=\"106376\" From_PhraseID=\"1fpspg-tmq-7ln-a9b-3mr3962ca_nl\" To_PhraseID=\"bqgccm-55n-iur-061-27obhegve_nl\"></Connection></Root>"; 

       XElement root = XElement.Load((new StringReader(rootXml)), LoadOptions.None); 

       root.Descendants().Where(i => i.Attribute("To_PhraseID").Value == "tg1c8p-jgg-dbh-b4l-hir5cpla7_nl") 
            .ToList() 
            .ForEach(i => i.SetAttributeValue("To_PhraseID", "MYNEWID")); 

       var x = root.ToString(); 
      } 
      catch (Exception ex) 
      { 

      } 
     } 
+0

Когда я вызываю эту функцию, ReplaceProductCodeInXML (строка xml, string nodeToUpdate, string newValue), что мне следует поместить в новое значение. Если я просто поставлю одну строку, все новые объекты будут иметь одинаковое значение ... Правильно? – Eleanor

Смежные вопросы