我有以下字符串:
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();
}
有没有更好的方法来解析这样的字符串来提取数据?
答案 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;