0

I have for example the following XML-File. As clean identifier exists "EA MagicNo" with a single id that will never be used twice.

In this example you can see, that the "Symbol" behind "EA MagicNo=111" is empty and must get a value e.g. "BBB".

<?xml version="1.0" encoding="utf-8"?>
<EAs>
  <EA MagicNo="000">
    <Date>2022-07-21</Date>
    <Symbol>AAA</Symbol>
  </EA>
  <EA MagicNo="111">
    <Date>2022-07-22</Date>
    <Symbol></Symbol>
  </EA>
</EAs>

I have a Forms-Application and use Buttons for doing everything.

So I can remove a complete Node with this code:

private void Btn_Remove_Click(object sender, EventArgs e)
{
    // load xml
    XDocument doc = XDocument.Load(@"test.xml");

    // remove a complete EA-Magic Element-Node
    XElement xel = doc.Descendants("EA")
        .Where(e => (string)e.Attribute("MagicNo") == "000")
        .SingleOrDefault();

    if (xel != null)
    {
        xel.Remove();
    }

    // save xml
    doc.Save(@"test.xml");
}

In result the XML looks after this like:

<?xml version="1.0" encoding="utf-8"?>
<EAs>
  <EA MagicNo="111">
    <Date>2022-07-22</Date>
    <Symbol></Symbol>
  </EA>
</EAs>

Also I can add a complete new Node with this Code:

private void Btn_Add_Click(object sender, EventArgs e)
{
    // load xml
    XDocument doc = XDocument.Load(@"test.xml");

    // add a new "EA" to "EAs"
    var parent = doc.Descendants("EAs")
        .SingleOrDefault();

    if (parent != null)
    {
        // create a new EA Node
        XElement el =
            new XElement("EA",
                new XAttribute("MagicNo", "222"),
                new XElement("Date", "2022-07-23"),
                new XElement("Symbol", "CCC")
            );

        // add it
        parent.Add(el);
}

But I am struggling to modify one line of an existing Node to add the empty Value "BBB". Please can you help me out with the needed lines of code?

Prepared code to start with:

private void Btn_Modify_Click(object sender, EventArgs e)
{
    // load xml
    XDocument doc = XDocument.Load(@"test.xml");

    // Code to modify the XElement here ...


    // save xml
    doc.Save(@"test.xml");
}

Dragon
  • 49
  • 7

2 Answers2

1

Seems like you can just use Linq to get the empty nodes, then modify the Value of each

var nodes = doc.Elements("EAs")
    .SelectMany(e => e.Elements("EA"))
    .SelectMany(e => e.Elements("Symbol"))
    .Where(e => e.Value == "");

foreach (var node in nodes)
{
    node.Value = "BBB";
}

dotnetfiddle

Charlieface
  • 52,284
  • 6
  • 19
  • 43
  • Thank you very much. Just still missing the Attribute "MagicNo" to identify the right node. Your lines of code shows me the right way to solf my issue. I updated my original post with my solution. Again, thank you very much. – Dragon Jul 24 '22 at 12:10
  • Looked like you didn't actually care what `MagicNo` was, so left that out – Charlieface Jul 24 '22 at 12:12
0

Working solution:

private void Btn_Modify_Click(object sender, EventArgs e)
{
    // load xml
    XDocument doc = XDocument.Load(@"test.xml");

    // Code to modify the XElement here ...
    // identify exact Node
    XElement xel = doc.Descendants("EA").Where(x => (string)x.Attribute("MagicNo") == "111").Single();
    // modify Value
    xel.Element("Symbol").Value = "BBB";

    // save xml
    doc.Save(@"test.xml");
}
Dragon
  • 49
  • 7