是否有任何函数从使用linq c#的xml中的字符串中获取数值,double值

时间:2016-10-06 06:56:12

标签: c# xml linq

尝试了这个,但需要在linq c#

  

Get value double value from string using RegEx in vb.net

 <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

3 个答案:

答案 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)

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