我有一个xml模板,用于将值存储到数据库中(通过Web服务)。我已经看到了如何使用linq更新xml字符串的示例。例如......
<Contacts>
<Contact>
<FirstName>Petar</FirstName>
<LastName>Petrovic</LastName>
<Email>p.petar@someemail.com</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>
你看,我有类似的节点,它们的属性区分,即名称属性......以及值属性......我如何使用linq更新它?我想我会选择一个新的Xelement使用xPath类型的东西,我会按名称选择元素,然后只设置该值?但我对如何做到有点困惑。有什么想法吗?
答案 0 :(得分: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";
}