Добавить элемент XML после нескольких элементов - PullRequest
0 голосов
/ 15 марта 2019

У меня есть этот XML:

<Meals>
    <Meal>
        <Food course="starter">Soup</Food>
        <Food course="mains">Fish</Food>
        <Food course="dessert">Ice cream</Food>
    </Meal>
    <Meal>
        <Food course="starter">Soup</Food>
        <Food course="mains">Chicken</Food>
        <Food course="dessert">Cheese</Food>
    </Meal>
    <Meal>
        <Food course="starter">Melon</Food>
        <Food course="mains">lamb</Food>
        <Food course="dessert">Ice cream</Food>
    </Meal>
</Meals>

И это выражение XPath:

//Food[@course='dessert' and text() = 'Ice cream']

Это находит каждый десертный курс мороженого. Я хочу добавить новый элемент после каждого соответствующего элемента, например, так:

<Meals>
    <Meal>
        <Food course="starter">Soup</Food>
        <Food course="mains">Fish</Food>
        <Food course="dessert">Ice cream</Food>
        <Review>enjoyed</Food>
    </Meal>
    <Meal>
        <Food course="starter">Soup</Food>
        <Food course="mains">Chicken</Food>
        <Food course="dessert">Cheese</Food>
    </Meal>
    <Meal>
        <Food course="starter">Melon</Food>
        <Food course="mains">lamb</Food>
        <Food course="dessert">Ice cream</Food>
        <Review>enjoyed</Food>
    </Meal>
</Meals>

Как я могу сделать это в C #, учитывая это выражение XPath? Выражение может измениться (например, вместо выбора сети), и структура XML также может измениться. Независимо от того, новый элемент должен быть вставлен после каждого соответствующего элемента.

Я знаю, что в XElement есть метод AddAfterSelf, но я не знаю, как использовать его в коллекции XElements, которую может вернуть выражение XPath.

Ответы [ 3 ]

1 голос
/ 15 марта 2019

Это просто, но мне нужно было напомнить от @Fabio, что foreach - это то, что необходимо:

foreach (var element in foodXml.XPathSelectElements(xpathExpression))
{
    element.AddAfterSelf(new XElement($"Review", "enjoyed"));
}

foodXml теперь имеет дополнительный понравившийся элемент после соответствующих элементов

1 голос
/ 15 марта 2019

LINQ to XML

var doc = XDocument.Parse("filepath");

var enjoyedMeals = 
   doc.Descendants("Meal")
      .Where(meal => meal.Elements.Any(food => food.Attribute("course").Value == "desert"));

foreach (var meal in enjoyedMeals)
{
    var review = new XElement("Review", "enjoyed");
    meal.Elements.Add(review);
}

doc.ToString(); // contains <Review> elements
0 голосов
/ 16 марта 2019

И это выражение XPath:

//Food[@course='dessert' and text() = 'Ice cream']

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

Это выражение неверно.Вам нужно:

/Meals/Meal[Food[@course = 'dessert'] = 'Ice cream']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...