Да, это возможно с помощью LINQ. Это пример кода для добавления нового элемента UnitTest
:
XDocument doc = XDocument.Load( "tests.xml" );
XNamespace ns = "http://microsoft.com/schemas";
XElement unitTest = new XElement( ns + "UnitTest",
new XElement( ns + "Execution", new XAttribute( "id", "E3" ) ),
new XAttribute( "name", "Test3" ),
new XAttribute( "id", "T3" ) );
doc.Root.Element( ns + "TestDefinitions" ).Add( unitTest );
doc.Save( "tests.xml" );
Чтобы добавить элемент, вы должны создать объект XElement
и передать его конструктору имя нового элемента и все его вещи, такие как дочерние элементы, атрибуты (через запятую). Затем необходимо указать, куда вы хотите добавить новый элемент: перейдя от корневого элемента к XML-трем (как в этом примере) или по запросу.
Вы можете найти нужный элемент по запросу LINQ. Следующий пример показывает, как получить все TestEntries
из TestList
с идентификатором L1
:
var query = from e in doc.Root.Elements( ns + "TestEntries" ).Elements()
where e.Attribute( "testListId" ).Value == "L1"
select new
{
TestId = e.Attribute( "testId" ).Value,
ExecutionId = e.Attribute( "executionId" ).Value
};
foreach ( var testEntry in query )
{
Console.WriteLine( testEntry.TestId + " " + testEntry.ExecutionId );
}
Объекты результата из этого запроса имеют анонимный тип с полезными свойствами. Если вы хотите работать с XElement
объектами, просто измените select new ...
на select e
.
Если вы хотите обновить значение элемента, найдите его (см. Выше) и вызовите метод SetValue()
.
Если вы работаете с пространствами имен (например, с файлом), вы должны создать XNamespace
объект с необходимым значением и объединить его с именами всех элементов, которые вам нужны.
Чтобы сохранить изменения в xml-файле в dist, вызовите метод Save()
.
Обзор LINQ to XML в MSDN