我正在尝试在xml文件中找到包含字符串“name”(不区分大小写)的第一个属性,然后更改其值。
以下是我的xmls
的示例//XML 1
<CtApproachTypes
DataclassId="1992A9CE-B048-4676-BFD4-FD81F1A65401"
EntityId="1992A9CE-B048-4676-BFD4-FD81F1A65401"
Name="PAR"
Remark="No Remarks"></CT_ApproachTypes>
//XML 2
<MiMissions
DataclassId="C196A66B-4FA1-461C-9EEF-95A4F2085051"
EntityId="C196A66B-4FA1-461C-9EEF-95A4F2085051"
MissionName="Standard"
Visib="1"></MiMissions>
//XML 3
<StSituations
DataclassId="679FAC3C-C9EF-41FD-9A13-957915605F01"
EntityId="679FAC3C-C9EF-41FD-9A13-957915605F01"
Sname="Standard"
Status="C"
Template="1"></StSituations>
我想修改“Name”,“MissionName”,“Sname”的值,然后将它们打印到控制台
修改 这是我的代码
public void updateXmlFile(string strFileName)
{
try
{
XmlDocument doc = new XmlDocument();
doc.Load(strFileName);
string newValue = GetUniqueKey();
XmlNodeList list = doc.SelectNodes("@*");
IEnumerable<XmlNode> filteredList= list.Cast<XmlNode>().Where(item=>item.Value.ToLower().Contains("name"));
foreach (XmlNode n in filteredList)
{
Console.WriteLine("NODES ARE : {0}", n);
}
doc.Save(strFileName);
}
catch (XmlException xex) { Console.WriteLine(xex); }
}
这没有打印出任何内容,我仍然需要使用字符串newValue
修改原始值答案 0 :(得分:2)
我会使用XDocument
对象,因为使用linq查询很容易。它位于System.Xml.Linq
命名空间和程序集中。
public void updateXmlFile(string strFileName)
{
XDocument xDoc = XDocument.Load(strFileName);
var nameAttributes = from el in xDoc.Root.Elements()
from attr in el.Attributes()
where attr.Name.ToString().ToLower().Contains("name")
select attr;
foreach (var attribute in nameAttributes)
{
attribute.Value = "newValue";
Console.WriteLine("{0}: {1}", attribute.Name, attribute.Value);
}
xDoc.Save(strFileName);
}
<强>更新强>
如果将示例中的XML保存到单个文件中,则这是输出:
Name: newValue
MissionName: newValue
Sname: newValue
答案 1 :(得分:1)
您可以做的是首先选择所有XML属性,然后使用LINQ选择包含“Name”的所有属性。
XmlDocument document = new XmlDocument();
...
XmlNodeList list = document.SelectNodes("@*");
IEnumerable<XmlNode> filteredList= list.Cast<XmlNode>().Where(item=>item.Value.ToLower().Contains("name"));
我希望这能指出你正确的方向。
编辑:
雷达,你说得对,我犯了一些错误。这段代码在我的机器上工作;-)我在我改变代码的地方添加了注释。 public void updateXmlFile(string strFileName)
{
try
{
XmlDocument doc = new XmlDocument();
doc.Load(strFileName);
string newValue = GetUniqueKey();
XmlNodeList list = doc.SelectNodes("//@*"); // Forgot the slashes here...
IEnumerable<XmlNode> filteredList = list.Cast<XmlNode>().
Where(item => item.Name.ToLower().Contains("name")); // Name property instead of Value
foreach (XmlNode n in filteredList)
{
n.Value = newValue; // Setting the value.
Console.WriteLine("FILTERED NODES ARE : {0}", n.Value);
}
doc.Save(strFileName);
}
catch (XmlException xex) { Console.WriteLine(xex); }
}