Манипулировать XML через C # - PullRequest
1 голос
/ 14 февраля 2011

У меня следующая структура xml. Я хочу обновить ее через c # Как обновить. Можно ли обновить через Linq, если да, то как это сделать?Я хочу добавить элементы UnitTest, TestList, TestEntry и UnitTestResults через код.

`

<?xml version="1.0" encoding="UTF-8"?>
<TestRun id="1" xmlns="http://microsoft.com/schemas">
     <TestDefinitions>
    <UnitTest name="Test1" id="T1">
      <Execution id="E1" />   
    </UnitTest>
    <UnitTest name="Test2" id="T2">
      <Execution id="E2" />   
    </UnitTest>
        :
        :

  </TestDefinitions>
    <TestLists>
    <TestList name="List1" id="L1" />
    <TestList name="List2" id="L2" />
     :
      :

  </TestLists>
  <TestEntries>
    <TestEntry testId="T1" executionId="E1" testListId="L1" />
    <TestEntry testId="T2" executionId="E2" testListId="L2" />
    :
    :
  </TestEntries>
  <Results>
    <UnitTestResult executionId="E1" testId="T1" testName="Test1" >
      <Output>
        <ErrorInfo>
          <Message>Hi</Message>
        </ErrorInfo>
      </Output>
    </UnitTestResult>
  </Results>
  <Results>
    :
    :
</TestRun>

`

1 Ответ

2 голосов
/ 14 февраля 2011

Да, это возможно с помощью 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

...