是否有更好的方法从这样的字符串中提取键/值

时间:2013-12-05 13:33:41

标签: c# string-parsing

我有以下字符串:

OK:<IDP RESULT="0" MESSAGE="some message" ID="oaisjd98asdh339wnf" MSGTYPE="Done"/>

我使用此方法来解析并获得结果:

public string MethodName(string capt)
{
    var receivedData = capt.Split(' ').ToArray();
    string _receivedReultValue = "";
    foreach (string s in receivedData)
    {
        if (s.Contains('='))
        {
            string[] res = s.Split('=').ToArray();
            if (res[0].ToUpper() == "RESULT")
            {
                string resValue = res[1];
                resValue = resValue.Replace("\\", " ");
                _receivedReultValue = resValue.Replace("\"", " ");
            }
        }
    }

    return _receivedReultValue.Trim();
}

有没有更好的方法来解析这样的字符串来提取数据?

5 个答案:

答案 0 :(得分:2)

你所拥有的并不是那么糟糕。但是,因为它是XML,你可以这样做:

class Program
{
    static void Main(string[] args)
    {
        var capt = "OK:<IDP RESULT=\"0\" MESSAGE=\"some message\" ID=\"oaisjd98asdh339wnf\" MSGTYPE=\"Done\"/>";
        var stream = new MemoryStream(Encoding.Default.GetBytes(capt.Substring(capt.IndexOf("<"))));
        var kvpList = XDocument.Load(XmlReader.Create(stream))
                   .Elements().First()
                   .Attributes()
                   .Select(a => new
                   {
                       Attr = a.Name.LocalName,
                       Val = a.Value
                   });
    }
}

这会给你一个匿名类型的IEnumerable

答案 1 :(得分:2)

您可以使用XDocument,假设您将在开头删除“OK:”,您可以这样做:

    static void Main(string[] args)
    {
        var str = "<IDP RESULT=\"0\" MESSAGE=\"some message\" ID=\"oaisjd98asdh339wnf\" MSGTYPE=\"Done\"/>";
        var doc = XDocument.Parse(str);
        var element = doc.Element("IDP");
        Console.WriteLine("RESULT: {0}", element.Attribute("RESULT").Value);
        Console.WriteLine("MESSAGE: {0}", element.Attribute("MESSAGE").Value);
        Console.WriteLine("ID: {0}", element.Attribute("ID").Value);
        Console.WriteLine("MSGTYPE: {0}", element.Attribute("MSGTYPE").Value);

        Console.ReadKey();
    }

编辑:我在.NET 4.5上测试了上面的代码。对于3.5我不得不改变它

    static void Main(string[] args)
    {
        const string str = "<IDP RESULT=\"0\" MESSAGE=\"some message\" ID=\"oaisjd98asdh339wnf\" MSGTYPE=\"Done\"/>";
        var ms = new MemoryStream(Encoding.ASCII.GetBytes(str));
        var rdr = new XmlTextReader(ms);
        var doc = XDocument.Load(rdr);
        var element = doc.Element("IDP");
        Console.WriteLine("RESULT: {0}", element.Attribute("RESULT").Value);
        Console.WriteLine("MESSAGE: {0}", element.Attribute("MESSAGE").Value);
        Console.WriteLine("ID: {0}", element.Attribute("ID").Value);
        Console.WriteLine("MSGTYPE: {0}", element.Attribute("MSGTYPE").Value);

        Console.ReadKey();
    }

答案 2 :(得分:0)

不确定。它看起来像XML,你可以使用普通的XML方法。 如果您删除“确定”并添加

<?xml version="1.0" ?>
<IDP RESULT="0" MESSAGE="some message" ID="oaisjd98asdh339wnf" MSGTYPE="Done"/>

这可以由任何XML解码器解析。尝试使用xmllint进行检查。

答案 3 :(得分:0)

您可以使用Regex获取所有键/值对:

string str = @"OK:<IDP RESULT=""0"" MESSAGE=""some message"" ID=""oaisjd98asdh339wnf"" MSGTYPE=""Done""/>";
var matches = Regex.Matches(str, @"(?<Key>\w+)=""(?<Value>[^""]+)""");

然后您可以访问RESULT属性:

var match = matches.OfType<Match>()
                   .FirstOrDefault(match => match.Groups["Key"].Value == "RESULT");
if (match != null)
{
    result = match.Groups["Value"].Value;
}

答案 4 :(得分:0)

试试这太简单了

 string xml = @"OK:<IDP RESULT=""0"" MESSAGE=""some message"" ID=""oaisjd98asdh339wnf"" MSGTYPE=""Done""/>";


        XElement xElement = XElement.Parse(new string(xml.Skip(3).ToArray()));
        //for example message 
          var message  = xElement.Attribute("MESSAGE").Value;