查找包含某个字符串的属性,并使用LINQ在c#中修改其值

时间:2010-09-01 09:39:01

标签: c# xml linq contains

我正在尝试在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

修改原始值

2 个答案:

答案 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); }

    }