尝试了这个,但需要在linq c#
<Root>
<Amount>
<Rate> INR to USD 3.0245</Rate>
</Amount>
<Amount>
<Rate> Dong to INR 5.201454</Rate>
</Amount>
</Root>
string xml = @"<Root>
<Amount>
<Rate> INR to USD 3.0245</Rate>
</Amount>
<Amount>
<Rate> Dong to INR 5.201454</Rate>
</Amount>
</Root>";
XDocument Doc = XDocument.Parse(xml);
var list = Doc.Descendants("Amount").Select(y => new
{
Rate = (string)y.Element("Rate")
}).FirstOrDefault();
需要使用linq c#
输出:3.0245,5.201454答案 0 :(得分:0)
从你的输出中,你似乎只需要数字本身,所以我寻找<Rate>
后代。然后对于他们每个人使用正则表达式(正则表达式适应了这个问题:Extract decimal from string)来找到数字并返回它:
string xml = @"<Root>
<Amount>
<Rate> INR to USD 3.0245</Rate>
</Amount>
<Amount>
<Rate> Dong to INR 5.201454</Rate>
</Amount>
</Root>";
XDocument Doc = XDocument.Parse(xml);
var list = Doc.Descendants("Rate")
.Select(y => Convert.ToDouble(Regex.Match(y.Value, @"\d+(?:\.\d+)?").Value))
.ToList();
如果你有<Rate>
个没有数字的元素,或者一个元素可能有超过1个数字,请使用:
var list = Doc.Descendants("Rate")
.SelectMany(y => Regex.Matches(y.Value, @"\d+(?:\.\d+)?").Cast<Match>().Select(x => x.Value))
.Select(y => Convert.ToDouble(y))
.ToList();
答案 1 :(得分:0)
你需要一个正则表达式来解析字符串:
XDocument Doc = XDocument.Parse(xml);
var r = new Regex(@".*(\d+[\.,]?\d+)");
var list = Doc.Descendants("Amount").Select(y => new
{
Rate = r.Matches[0]((string)y.Element("Rate").Value)
});
var rate = Convert.ToDouble(list.First().Rate);
正则表达式将使用冒号和点作为十进制分隔符匹配两个符号。当您只需要点时,regx将简化为@".*(\d+[\.]?\d+)"
。
答案 2 :(得分:0)
如果你想在不使用正则表达式的情况下解析它,你也可以试试这个。
此代码依赖于以下事实:数值速率值位于字符串的末尾,并且前面有一个空格' '
。
因此,最后一个空格之后的文本被解析为double
。 CultureInfo
设置为en
,以确保正确识别小数点。
var doc = XDocument.Parse(input);
double[] values = doc.Root
.Descendants("Rate")
.Select( elem => double.Parse(elem.Value.Substring(elem.Value.LastIndexOf(' ')),CultureInfo.GetCultureInfoByIetfLanguageTag("en")))
.ToArray ();