2011-02-14 78 views
1

我有以下xml結構我想通過c更新它# 如何更新它 是否有可能通過Linq更新如果是的話那麼該怎麼做呢? 我想通過代碼添加UnitTest,TestList,TestEntry和UnitTestResults元素。通過c操縱xml#

`

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

`

+0

我會考慮調查XSLT。通過精心設計的XSLT工作表,您可以將XML轉換爲任何您想要的形式,例如以便於用戶使用的方式顯示數據的xhtml文檔。然後,您的C#代碼變得微不足道,您只需應用轉換,或者您可以將樣式表聲明添加到xml中,然後在任何瀏覽器中打開它。 – Flynn1179 2011-02-14 09:56:23

回答

2

是的,這是可以通過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查詢找到需要的元素。下面的例子演示瞭如何獲取從TestList所有TestEntries ID爲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對象,並將其與所需的所有元素名稱連接起來。

要保存對dist上xml文件的更改,請調用Save()方法。

LINQ to XML Overview in MSDN

+1

我給你+1了;但LINQ在哪裏? – 2011-02-14 10:30:25