0

我在这个社区中真正看重的一件事是学习用两条线做事的方法,这通常需要我 20 年。本着这种精神,我已尽我所能将一些字符串解析从十几行减少到三行。但我觉得有人想向我展示这实际上是多么的一团糟。只是为了我自己的熏陶,有没有更清洁的方法来做以下事情?这一切可以在一条线上完成吗?

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

更新

感谢您的快速回复!真正有用的例子和好的建议,最少的蛇。:) 更少的行与简洁和优雅是不一样的,减少行实际上可能会使代码变得更糟。

让我重新表述这个问题。

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

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

我不经常使用 XML。我喜欢 Sperske 的解决方案,但我不知道如何使其动态化。换句话说,我不能将值放入我的代码中。我需要找到键“messageFilter”,然后获取与该键关联的所有值。

我所做的工作,但它似乎有点麻烦。有没有更直接的方法来获取关键值?并添加一个新的?

4

3 回答 3

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"
于 2013-04-11T20:37:56.027 回答
2

它已经得到了回答,但对于未来的读者来说——如果你想解析更大的 XML、根节点和许多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按名称或其他标准进行过滤 - 这完全取决于您!

于 2013-04-11T20:57:17.647 回答
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(';');
于 2013-04-11T20:32:57.743 回答