C#查找和替换属性XML

时间:2017-10-06 08:01:32

标签: c# xml

我有一个带有以下结构的输出XML文件

<OFBM time="10:32" date="06.10.2017" saveName="Unnamed save">
<folder name="file:///C:/Users/AD/Downloads" />
<folder name="file:///C:/Users/AD/Desktop/t" />
<folder name="file:///C:/ProgramData/OFBM" />
</OFBM>

日期和时间组合是唯一的。如何根据时间和日期,我可以解析一个会改变saveName属性的值? 这样做的最佳方法是什么?

这是我写的

    public void saveNames(string time, string date, string folderName)
    {
    if(folderName == "Unnamed save")
    return;
    XElement root = XElement.Load(pathToXml);
        IEnumerable<XElement> address =
            from el in root.Elements("OFBM")
            where (string)el.Attribute("time") == time
            where (string)el.Attribute("date") == date
            select el;
        foreach (XElement el in address.Elements("saveName"))
        {
            el.ReplaceWith(folderName);

        }
        root.Save(pathToXml);

    }

也尝试了这个

            //  <OFBM time="10:30" date="06.10.2017" saveName="Unnamed save">
        XPathDocument document = new XPathDocument(pathToXml);
        //The XPathNavigator object is used for read-only XPath queries. The XPath queries may return a resulting value or many nodes
        XPathNavigator documentNav = document.CreateNavigator();
        // This expression uses standard XPath syntax.
        string filter = "@*";
        XPathNodeIterator NodeIter = documentNav.Select(filter);
        while (NodeIter.MoveNext())
        {
            Console.WriteLine("Save: {0}", NodeIter.Current.Value);
        };

PS。但是,我的代码没有任何改变。

2 个答案:

答案 0 :(得分:2)

如果您只有Xml片段(如您的示例中所示),则可以使用以下代码:

if (root.Attribute("time").Value == time && 
    root.Attribute("date").Value == date &&
    root.Attribute("saveName") != null)
{
    root.Attribute("saveName").Value = folderName;
}

root OFBM 元素...因此root.Element("OFBM")为空

编辑:

如果你有一个带有几个 OFBM 元素的xml(我认为你有多个)。使用此:

var address = root.Elements("OFBM").Where(element =>
    element.Attribute("time").Value == time &&
    element.Attribute("date").Value == date &&
    element.Attribute("saveName") != null);

foreach (XElement el in address)
{
    el.Attribute("saveName").Value = folderName;
}

Xml示例:

<root>
  <OFBM time="10:32" date="06.10.2017" saveName="Unnamed save">
   <folder name="file:///C:/Users/AD/Downloads" />
   <folder name="file:///C:/Users/AD/Desktop/t" />
   <folder name="file:///C:/ProgramData/OFBM" />
  </OFBM>
  <OFBM time="10:42" date="06.10.2017" saveName="Unnamed save">
   <folder name="file:///C:/Users/AD/Downloads" />
   <folder name="file:///C:/Users/AD/Desktop/t" />
   <folder name="file:///C:/ProgramData/OFBM" />
  </OFBM>
</root>

答案 1 :(得分:2)

有几个问题:

root

此处,OFBM root.Elements()。因此,当您查询OFBM时,返回的元素将是folder的子元素,即3个root.Elements("OFBM")元素。这意味着您的查询ReplaceWith将永远不会返回任何元素。

其次,saveName将用一些文本替换整个元素。您想要设置var root = XElement.Load("path/to/file.xml"); if ((string) root.Attribute("time") == "10:32" && (string) root.Attribute("date") == "06.10.2017") { root.SetAttributeValue("saveName", "new folder name"); } root.Save("path/to/file.xml"); 属性值。

此代码可以使用:

container