2015-11-11 3 views
1

Мне нужно либо добавить пару дочерних узлов, либо обновить узел, если он уже существует. Как видно из небольшого примера ниже, у меня есть один узел с дочерними узлами, а другой - без него. Скажем, у меня есть определение, исходящее из таблицы SQL для обоих из них, я хочу добавить значение к узлу.Добавление или обновление XML-узла

XML

<workbook> 
<datasources> 
    <column datatype='real' name='[CONTRACT_PAYMENT_AMT]' role='measure' type='quantitative'> 
     <desc> 
      <formatted-text> 
      <run>The amount being paid on the contract.</run> 
      </formatted-text> 
     </desc> 
    </column> 
    <column datatype='real' name='[CONTRACT_PAYMENT_DATE]' role='measure' type='quantitative'> 
    </column> 
</datasources> 

Вот код, я должен просто получить имя атрибута. Столбцы - это класс, который потенциально может содержать тип данных, имя, роль и тип.

IEnumerable<string> names = from Columns in XDocument.Load(path).Descendants("column")           
            select Columns.Attribute("name").Value; 

     foreach (string name in names) 
     { 

     } 

Это было предназначено для начала метода.

У меня возникли проблемы с мыслью о том, как я могу хранить значения и обновлять XML-документ, или просто смотреть на каждый узел, возможно, и обновляться по мере его прохождения через документ. Есть идеи?

EDIT - новый код, добавляющий новое значение в текущий узел Run, но не добавляющий новый ... с определением.

var document = XDocument.Load(path); 
      var elements = (from column in document.Descendants("column") 
          select new 
           { 
            AttributeName = column.Attribute("name").Value, 
            Run = column.Descendants("run").FirstOrDefault() ?? new XElement("run") 
           }).ToList(); 

      foreach (var item in elements) 
      { 
       if (item.Run == null) continue; 
       else 
       { 
        item.Run.Value = GetVariable(item.AttributeName); 
            // Getvariable is the method that returns the definition 
       } 
      } 

      document.Save(path); 
+0

Что вы хотите обновить? Атрибут или просто целый узел? – CodeNotFound

+0

@CodeNotFound На основании атрибута name я хочу запросить таблицу значений для этого имени, а затем добавить дочерний узел (ы) desc с определением из моей таблицы. Определение будет находиться внутри <.run> – Markpelly

+0

Возможно ли иметь несколько элементов столбца с одинаковым значением имени атрибута? – CodeNotFound

ответ

0

Вы можете усеивают следующую логику:

var document = XDocument.Load(path); 
var elements = (from column in document.Descendants("column") 
       select new 
       { 
        AttributeName = column.Attribute("name").Value, 
        Parent = column, 
        Run = column.Descendants("run").FirstOrDefault() 
       }).ToList(); 

foreach(var item in elements) 
{ 
    XElement run; 
    if (item.Run == null) 
    { 
      run = new XElement("run"); 
      item.Parent.Add(
       new XElement("desc", 
        new XElement("formatted-text", 
         run 
       ) 
      ) 
     ); 
     } 
     else 
     { 
      run = item.Run; 
     } 

     if(item.AttributeName == "BlaBlaOne") 
     { 
      run.Value = "Your definition here"; 
     } 
} 

document.Save(path); 
+0

Отлично, это было очень просто, но я не мог обернуть вокруг синтаксиса. Отмечено как ответ. – Markpelly

+0

Это обновление узла Run, но я не могу его добавить, чтобы добавить его под узлом Column. Может быть, потому, что у нас нет полного набора узлов? Я добавил новую информацию наверху, которая адаптирована для кода, который вы придумали. – Markpelly

+0

Хорошо, я обновил код в ответе – CodeNotFound

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