C#:帮助抛光字符串解析

时间:2013-04-11 20:28:49

标签: c# xml parsing

我真正重视这个社区的一件事就是学习如何用两条线做事,这通常需要我20分。本着这种精神,我已经尽力将一些字符串解析从大约十几行到三行。但我觉得有人想告诉我这实际上是一团糟。仅仅为了我自己的启发,是否有更简洁的方法来做以下事情?可以一行完成吗?

string getThis = "<add key=\"messageFilter\" value=\"";
string subStr = strFile.Substring(strFile.IndexOf(getThis) + getThis.Length);
string[] igPhrases = subStr.Substring(0, subStr.IndexOf(";\"")).Split(';');

更新

感谢您的快速回复!真正有用的例子和良好的建议与最低限度的snark。 :)更少的线条与干净优雅不同,减少线条实际上可能会使代码变得更糟。

让我重新解释一下这个问题。

我有一个XML文档,其中包含以下行:<add key="messageFilter" value="Out of Office AutoReply;Automatic reply;"/>。此文档告诉我们的自动售票系统不会从主题行中包含这些短语的电子邮件创建票证。否则,我们会得到无限循环。

我正在开发一个小程序,它将列出已包含的短语,然后允许用户添加新短语。如果我们注意到新的自动回复消息开始在系统中循环,我们需要能够将该消息的语言添加到过滤器。

我对XML不起作用。我喜欢Sperske的解决方案,但我不知道如何让它变得动态。换句话说,我不能把价值放在我的代码中。我需要找到密钥“messageFilter”,然后获取与该密钥相关的所有值。

我所做的工作,但似乎有点麻烦。是否有更简单的方法来获取关键值?并添加一个新的?

3 个答案:

答案 0 :(得分:5)

略有不同的一个衬垫(为便于阅读而分开):

System.Xml.Linq.XDocument
  .Parse("<add key='messageFilter' value='AttrValue'/>")
  .Root
  .Attribute("value")
  .Value

输出:

AttrValue

要解决更新的问题,您可以将所有<add>个节点转换为字典(借用Pako的优秀答案,并使用稍长的字符串):

var keys = System.Xml.Linq.XDocument
  .Parse("<keys><add key='messageFilter' value='AttrValue'/><add key='userFilter' value='AttrValueUser'/></keys>")
  .Descendants("add")
  .ToDictionary(r => r.Attribute("key").Value, r => r.Attribute("value").Value);

这使您可以像这样访问您的密钥:

keys["messageFilter"] == "AttrValue"
keys["userFilter"] == "AttrValueUser"

答案 1 :(得分:2)

它已经得到了回答,但对于未来的读者 - 如果你想解析更大的XML,使用root和许多add节点,你可能需要使用稍微不同的东西。

string xmlPart = "<add key=\"messageFilter\" value=\"\" />";
string xml = "<root>" + xmlPart + "</root>";
var x = XDocument.Parse(xmlPart, LoadOptions.None);

var attributes1 = x.Descendants("add").Select(n => n.Attributes());
var attributes2 = x.Descendants("add").SelectMany(n => n.Attributes());

这会让您IEnumerable<IEnumerable<XAttribute>>(请参阅attributes1)或IEnumerable<XAttribue>(请参阅attributes2)。第二个选项将简化结果 - 所有属性都将保存在一个集合中,无论它们来自哪个节点 当然,没有什么能阻止你按名称或其他标准过滤XAttributes - 这完全取决于你!

答案 2 :(得分:1)

一条丑陋的线:

string[] igPhrases = strFile.Substring(strFile.IndexOf(getThis) + ("<add key=\"messageFilter\" value=\"").Length).Substring(0, strFile.Substring(strFile.IndexOf("<add key=\"messageFilter\" value=\"") + ("<add key=\"messageFilter\" value=\"").Length).IndexOf(";\"")).Split(';');