質問

I dynamically generate XML file using XElement class. The sequence of interest looks as following:

<Actions>
    <Action Id="35552" MailRuId="100000">
      <ActionTypeId>2</ActionTypeId>
      <GenreTypeId>16</GenreTypeId>
    </Action>
    <Action Id="36146" MailRuId="100001">
      <ActionTypeId>7</ActionTypeId>
      <GenreTypeId>2</GenreTypeId>
      <ActionDate Id="127060" FreeTicketsCount="26" ReservedTicketsCount="3">06.09.2013 18:00:00</ActionDate>
    </Action>
</Actions>

I want to remove "Action" node if "ActionDate" child node doesn't exit.

The code that generates XML file looks as following:

var actionElement = new XElement("Action",
    new XElement("ActionTypeId", first.ActionTypeId),
    new XElement("GenreTypeId", first.GenreTypeId));

IEnumerable<XElement> seanceElements = infos
    .GroupBy(ti => ti.ActionDate)
    .Select(CreateSeanceElement);

actionElement.Add(seanceElements);

The CreateSeanceElement method creates "ActionDate" node, but as I've said it could or couldn't be created.

役に立ちましたか?

解決

Select all elements which do not have ActionDate element (i.e. it is null) and remove them from actions element:

actions.Elements("Action")
       .Where(a => a.Element("ActionDate") == null)
       .Remove();

BTW if you are generating XML, consider not to add such elements. It's better than add and remove.

他のヒント

i'll give you another example:

     XDocument doc = XDocument.Load("D:\\tmp.xml");
     List<XElement> elements = new List<XElement>();

     foreach (XElement cell in doc.Element("Actions").Elements("Action"))
     {
        if (cell.Element("ActionDate") == null)
        {
           elements.Add(cell);
        }
     }

     foreach (XElement xElement in elements)
     {
        xElement.Remove();
     }

     doc.Save("D:\\tst.xml");
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top