是否有任何函数可以使用linqc#从XML中获得字符串的数值,双精度值
本文关键字:字符串 双精度 XML 函数 任何 可以使 linqc# 是否 | 更新日期: 2023-09-27 18:11:41
已经尝试过了,但需要在linq c#
在vb.net中使用RegEx从字符串中获取值的双精度值
<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();
需要输出:3.0245,5.201454使用linq c#
从您的输出来看,似乎您所需要的只是数字本身,所以我寻找<Rate>
后代。然后对它们中的每一个使用正则表达式(正则表达式适用于这个问题的大小写:从字符串中提取十进制)来查找数字并返回它:
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();
您需要一个正则表达式来解析字符串:
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+)"
。
如果您想在不使用正则表达式的情况下解析它,您也可以尝试这样做。这段代码依赖于这样一个事实,即数值速率值位于字符串的末尾,并且在其前面有一个空格' '
。
因此,最后一个空格之后的文本被解析为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 ();