是否有任何函数可以使用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#

是否有任何函数可以使用linqc#从XML中获得字符串的数值,双精度值

从您的输出来看,似乎您所需要的只是数字本身,所以我寻找<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+)"

如果您想在不使用正则表达式的情况下解析它,您也可以尝试这样做。这段代码依赖于这样一个事实,即数值速率值位于字符串的末尾,并且在其前面有一个空格' '
因此,最后一个空格之后的文本被解析为doubleCultureInfo设置为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 ();