0

尝试从下面的 XML 文件中提取值时遇到问题。我需要将以下值传递给 C# 对象:EXPR、DATE、ASK。我将使用 LINQ。我遇到了 EXPR 值的问题,因为它没有分组,我能得到的只是第一个值。有任何想法吗?

<RESPONSE>
    <EXPR>USD</EXPR>
    <EXCH>EUR</EXCH>
    <AMOUNT>1</AMOUNT>
    <NPRICES>1</NPRICES>
    <CONVERSION>
        <DATE>Sat, 02 Jun 2001 22:50:00 GMT</DATE>
        <ASK>0.8484</ASK>
        <BID>0.8479</BID>
    </CONVERSION>
    <EXPR>USD</EXPR>
    <EXCH>CAD</EXCH>
    <AMOUNT>1</AMOUNT>
    <NPRICES>1</NPRICES>
    <CONVERSION>
        <DATE>Sat, 02 Jun 2001 15:54:57 GMT</DATE>
        <ASK>0.6505</ASK>
        <BID>0.6501</BID>
    </CONVERSION>
    <EXPR>USD</EXPR>
    <EXCH>FRF</EXCH>
    <AMOUNT>1</AMOUNT>
    <NPRICES>1</NPRICES>
    <CONVERSION>
        <DATE>Thu, 31 Dec 1998 00:00:00 GMT</DATE>
        <ASK>0.1779</ASK>
        <BID>0.1779</BID>
    </CONVERSION>
    <EXPR>USD</EXPR>
    <EXCH>DEM</EXCH>
    <AMOUNT>1</AMOUNT>
    <NPRICES>1</NPRICES>
    <CONVERSION>
        <DATE>Thu, 31 Dec 1998 00:00:00 GMT</DATE>
        <ASK>0.5967</ASK>
        <BID>0.5964</BID>
    </CONVERSION>
</RESPONSE>

代码:

XmlDocument doc = new XmlDocument();
doc.Load(xmlUrl);

XmlNode GeneralInformationNode =
doc.SelectSingleNode("/RESPONSE");
foreach (XmlNode node in GeneralInformationNode)
{
   var currrates = new Rates();
   currrates.Currency_ID =
            GeneralInformationNode.SelectSingleNode("EXCH").InnerText;
   currrates.Sell_Rate =
           GeneralInformationNode.SelectSingleNode("EXPR").InnerText;
   Console.WriteLine(currrates.Currency_ID + currrates.Sell_Rate);
   Console.ReadKey();
}
4

3 回答 3

1

这不是最优雅的解决方案,但我相信它会满足您的需求。

首先让我们定义对象以包含您的数据:

    public class Data
    {
        public string Expr { get; set; }
        public string Exch { get; set; }
        public int Amount { get; set; }
        public int NPrices { get; set; }
        public Conversion Conversion { get; set; }
    }
    public class Conversion
    {
        public DateTime Date { get; set; }
        public decimal Ask { get; set; }
        public decimal Bid { get; set; }
    }

根据需要更改名称和类型。现在您可以循环遍历,只要 XML 文档在其元素的顺序上是一致的。

        var input = System.Xml.Linq.XElement.Parse("*Your XML here*");
        var output = new List<Data>();
        for (int i = 0; i < input.Elements().Count(); i += 5)
        {
            var items = new System.Xml.Linq.XElement(
                 "group", input.Elements().Skip(i).Take(5));
            var item = new Data();
            output.Add(item);

            item.Expr = items.Element("EXPR").Value;
            item.Exch = items.Element("EXCH").Value;
            item.Amount = int.Parse(items.Element("AMOUNT").Value);
            item.NPrices = int.Parse(items.Element("NPRICES").Value);

            var conversion = items.Element("CONVERSION");
            item.Conversion = new Conversion();
            item.Conversion.Date = DateTime.Parse(conversion.Element("DATE").Value);
            item.Conversion.Ask = decimal.Parse(conversion.Element("ASK").Value);
            item.Conversion.Bid = decimal.Parse(conversion.Element("BID").Value);
        }
于 2013-06-24T19:43:49.813 回答
1

如果每个 都应该有一个唯一EXPRCONVERSION,这似乎是糟糕的 XML。话虽如此,我知道您无法更改您拥有的 XML。EXPR如果您依赖于元素在每个元素之前这一事实,CONVERSION则可以依赖 LINQ 方法Zip。阅读Zip 此处的文档。您的代码可能如下所示:

var xmlDoc = XDocument.Parse(myXmlString);
var exprs = xmlDoc.Descendants("EXPR");
var conversions = xmlDoc.Descendants("CONVERSION");
var structuredInfo = exprs.Zip(conversions, Tuple.Create)
   .Select(info => new { 
           Expr = info.Item1.Value, 
           Date = info.Item2.Element("DATE").Value,
           Ask = info.Item2.Element("ASK").Value
 });
于 2013-06-24T19:44:10.663 回答
0

由于您的 XML 与它一样荒谬,我能做的最好的就是获取EXPRs 列表和CONVERSION节点列表,并将它们相互关联

        XDocument xDoc = XDocument.Load("XMLFile1.xml");
        List<string> EXPRs = xDoc.Element("RESPONSE").Elements("EXPR").Select( e => e.Value).ToList();
        List<XElement> CONVERSIONs = xDoc.Element("RESPONSE").Elements("CONVERSION").ToList();

        for(int i=0; i<EXPRs.Count; i++)
        {
            var currrates = new Rates();
            currrates.Currency_ID = EXPRs[i];
            currrates.DATE = CONVERSIONs[i].Element("DATE").Value;

            Console.WriteLine(currrates.Currency_ID + currrates.Sell_Rate);
            Console.ReadKey();
        }
于 2013-06-24T19:43:12.703 回答