XDocument xml проанализирован, но не может сохранить атрибуты. Xml .Linq - PullRequest
0 голосов
/ 15 февраля 2020

Я зацикливаюсь на элементах управления и задаю значения текстового поля в xml примерно так:

using System.Xml.Linq;

/* code */

XDocument _xml = XDocument.Load(_DialogOpen);

foreach (Control t in tableLayoutPanel.Controls)
{
    if (t is TextBox)
    {
        //setting the value
        _xml.Root.SetAttributeValue("isPreview", t.Text);
        //log
        textBox.AppendText("n=" + t.Name + " t=" + t.Text + Environment.NewLine);           
    }
}

_xml.Save(_DialogOpen);

Моя проблема в том, что _xml.Save(_DialogOpen); сохраняет, но ни один из атрибутов не изменяется, и там не исключение Если у кого-то есть какие-либо предложения, он будет очень признателен.

xml пример:

<?xml version="1.0" encoding="utf-8"?>
<config id="1">
  <parmVer __id="0" version="V1234" />
    <RecordSetChNo __id="0" isPreview="1" AIVolume="15" />
    <RecordSetChNo __id="1" isPreview="1" AIVolume="15" />
    <RecordSetChNo __id="2" isPreview="1" AIVolume="15" />
    <RecordSetChNo __id="3" isPreview="1" AIVolume="15" />
    <RecordSetChNo __id="4" isPreview="1" AIVolume="15" />
    <RecordSetChNo __id="5" isPreview="1" AIVolume="15" />
    <RecordSetChNo __id="6" isPreview="1" AIVolume="15" />
    <RecordSetChNo __id="7" isPreview="1" AIVolume="15" />
</config>

1 Ответ

3 голосов
/ 15 февраля 2020

Взгляните на следующую строку из OP

_xml.Root.SetAttributeValue("isPreview", t.Text);

Приведенный выше код пытается установить атрибут в элементе Root, когда он выглядит так, как будто вы хотите установить его для элемента * 1004. *.

Также предположим, что вы хотите установить атрибут на основе каждого из текстовых полей, ie, каждое текстовое поле имеет соответствующий атрибут в xml. В таком случае вам нужно будет отфильтровать правильный XElement (поскольку их более одного RecordSetChNo) перед установкой атрибута.

    foreach (Control t in tableLayoutPanel.Controls)
    {
        if (t is TextBox)
        {
            //filter the xelement, only a sample here. 
            // Should change according to your requirement
            var filteredXElement = _xml.Root
                                      .Descendants("RecordSetChNo")
                                      .First(x=>x.Attribute("__id").Value==idToFilter);
            // Now set the attribute for the filtered Element
            filteredXElement.SetAttributeValue("isPreview", t.Text);
            //log
            textBox.AppendText("n=" + t.Name + " t=" + t.Text + Environment.NewLine);           
        }
    }
...