2012-05-29 196 views
1

我有一個xml模板,用於將值存儲到數據庫(通過Web服務)。我見過如何使用linq更新XML字符串的例子。例如...使用linq更新XML節點屬性

<Contacts> 
    <Contact> 
     <FirstName>Petar</FirstName> 
     <LastName>Petrovic</LastName> 
     <Email>[email protected]</Email> 
     <Address>Pere Perica 10</Address> 
     <ZipCode>1000</ZipCode> 
     <City>Belgrade</City> 
     <State>Serbia</State> 
    </Contact> 
</Contacts> 

如果這是你想更新XML文檔,你只會做一些

XElement xmlDoc = new XElement("Contacts", 
        from c in db.Contacts 
        orderby c.ContactID 
        select new XElement("Contact", 
         new XElement("ContactID", c.ContactID), 
         new XElement("FirstName", c.FirstName), 
         new XElement("LastName", c.LastName))); 
xmlDoc.Save(Server.MapPath(@"~/export.xml")); 

這是很酷。但是我需要更新除了屬性之外基本相同的節點。例如...

<?xml version="1.0" encoding="utf-8"?> 
<dataTemplateSpecification id="id1" name="name1"> 
    <description> 
    <html>text</html> 
    </description> 
    <templates> 
    <template> 
     <elements> 
     <element id="element0" name="PatientId" display="Patient ID" dataType="String" visable="true" readOnly="false"> 
     </element> 
     <element id="element1" name="EMPIID" display="EMPI ID" dataType="String" visable="true" readOnly="true"> 
     </element> 
     </elements> 
     <dataTypeSpecifications> 
     <dataTypeSpecification id="" baseType="KeyValuePair"> 
      <dictionaryDefinition> 
      <item key="-1" value="-SELECT-" /> 
      <item key="1" value="YES" /> 
      <item key="0" value="NO" /> 
      </dictionaryDefinition> 
     </dataTypeSpecification> 
     </dataTypeSpecifications> 

你看,我有被它們的屬性,即name屬性...以及屬性的值區分類似的節點......我將如何使用LINQ更新那?我想我會選擇一種新的Xelement使用類型的xPath類型的東西,我會選擇名稱的元素,然後只是設置該值?但我對如何做到這一點有些困惑。有任何想法嗎?

回答

1

正如您所建議的,您可以按名稱選擇一個元素(屬性),並指定一個新值。 我已經改變了你的第一個元素。

 var xml = XElement.Load("XMLFile1.xml"); 

     var node = xml.Descendants("element").Where(e => e.Attribute("id").Value == "element0").FirstOrDefault(); 
     if (node != null) 
     { 
      node.Attribute("name").Value = "something else"; 
     }