我有一个带有以下结构的输出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。但是,我的代码没有任何改变。
答案 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