Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在多个元素之后添加XML元素_C#_Xml_Xpath - Fatal编程技术网

C# 在多个元素之后添加XML元素

C# 在多个元素之后添加XML元素,c#,xml,xpath,C#,Xml,Xpath,我有以下XML: <Meals> <Meal> <Food course="starter">Soup</Food> <Food course="mains">Fish</Food> <Food course="dessert">Ice cream</Food> </Meal> <Meal>

我有以下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>
这是冰淇淋的每一道甜点。我想在每个匹配元素之后添加一个新元素,如下所示:

<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>

汤
鱼
冰淇淋
享受
汤
鸡
奶酪
甜瓜
羔羊
冰淇淋
享受
在给定XPath表达式的情况下,如何在C#中实现这一点?表达式可能会改变(例如选择mains),XML的结构也可能会改变。无论如何,必须在每个匹配元素之后插入新元素

我知道XElement上有一个AddAfterSelf方法,但我不知道如何在XElement集合上使用它,XPath表达式可能会返回该方法。

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
var doc=XDocument.Parse(“文件路径”);
var enjoyedMeals=
后代医生(“膳食”)
.Where(膳食=>膳食.Elements.Any(食品=>食品.Attribute(“课程”).Value==“沙漠”));
foreach(在enjoyedMeals中的var餐)
{
var review=新项目(“审查”、“享受”);
膳食。元素。添加(回顾);
}
doc.ToString();//包含元素
LINQ到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
var doc=XDocument.Parse(“文件路径”);
var enjoyedMeals=
后代医生(“膳食”)
.Where(膳食=>膳食.Elements.Any(食品=>食品.Attribute(“课程”).Value==“沙漠”));
foreach(在enjoyedMeals中的var餐)
{
var review=新项目(“审查”、“享受”);
膳食。元素。添加(回顾);
}
doc.ToString();//包含元素

这很简单,但我需要@Fabio的提醒,foreach是必要的:

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

foodXml现在在匹配元素之后有了额外的元素

这很简单,但我需要@Fabio的提醒,foreach是必要的:

foreach (var element in foodXml.XPathSelectElements(xpathExpression))
{
    element.AddAfterSelf(new XElement($"Review", "enjoyed"));
}
foodXml现在在匹配元素之后有了额外的元素

这个XPath表达式:

//Food[@course='dessert' and text() = 'Ice cream']
//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>
这个表达是错误的。你需要:

/Meals/Meal[Food[@course = 'dessert'] = 'Ice cream']
这个XPath表达式:

//Food[@course='dessert' and text() = 'Ice cream']
//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>
这个表达是错误的。你需要:

/Meals/Meal[Food[@course = 'dessert'] = 'Ice cream']

谢谢,这很有用。但是,我必须使用XPath表达式,XML的结构可能会改变,因此我无法在代码中引用任何元素属性。不管怎样,这已经帮我找到了解决办法,所以非常感谢!谢谢,这很有用。但是,我必须使用XPath表达式,XML的结构可能会改变,因此我无法在代码中引用任何元素属性。不管怎样,这已经帮我找到了解决办法,所以非常感谢!我对问题进行了编辑,以明确XPath找到的是“每道冰淇淋甜点”,而不是“每顿有冰淇淋甜点的饭菜”。XPath在问题中是正确的。没问题,我的问题是如何在C#中添加元素。无论如何,谢谢你。我编辑了这个问题,以明确XPath找到的是“每道冰淇淋甜点”,而不是“每顿有冰淇淋甜点的饭”。XPath在问题中是正确的。没问题,我的问题是如何在C#中添加元素。无论如何谢谢你