使用Xdoc从XMl文档中获取属性

时间:2013-03-29 01:06:09

标签: c# xml linq-to-xml

很难从我的XML中检索属性。我需要抓住这个属性,并发送和存储它。我无法理解这些属性。 :(只需要帮助了解属性。

<portfolios>
  <portfolio>
    <id>00001</id>
    <investment ticker="ASD">
      <shares>20</shares>
      <price>42.50</price>
    </investment>
  </portfolio>

  <pricedata days="4">
    <stock ticker="ASD">
      <price value="42.50"/>
      <price value="43.50"/>
      <price value="39.00"/>
      <price value="45.00"/>
    </stock>
  </pricedata>
</portfolios>

到目前为止我有什么!

public bool readXmlData(String filename)
{
    XDocument document = XDocument.Load(filename);

    foreach (XElement portfolio in document.Descendants("portfolio"))
        {
            XElement id = portfolio.Element("id");
            string id2 = id != null ? id.Value : string.Empty;
            portList.Add(new SmallPortfolio(id2));

            XAttribute ticker = portfolio.Attribute("investment");

            foreach(XElement investment in document.Descendants("investment"))
            {
                XElement shares = investment.Element("shares");
                XElement price =  investment.Element("price");

                temp.Add(new Investment(

                ticker != null ? ticker.Value : string.Empty,
                shares != null ? int.Parse(shares.Value) : default(int),
                price != null ? double.Parse(shares.Value) : default(double)
                ));
            }
        }

    foreach (XElement stock in document.Descendants("pricedata"))
    {
        XAttribute tick = stock.Attribute("stock");
        List<Double> pricetemp2 = new List<Double>();
        foreach (XElement price in document.Descendants("stock"))
        {
            XAttribute value = price.Attribute("price");
            pricetemp2.Add(value.Value);
        }
        groupList.Add(new PriceGroup(tick,pricetemp2));
    }
    return true;
}
public List<SmallPortfolio> getPortfolioList() { return null; }
public List<PriceGroup> getPriceList() { return null; }
}

1 个答案:

答案 0 :(得分:1)

<price>是一个元素,但您正在访问它,就好像它是一个属性<stock price="..."/>

试试这个:

foreach (XElement stock in document.Descendants("stock"))
{
    string ticker = (string)stock.Attribute("ticker");
    List<Double> pricetemp2 = new List<Double>();
    foreach (XElement price in stock.Descendants("price"))
    {
        double value = (double)price.Attribute("value");
        pricetemp2.Add(value);
    }
    groupList.Add(new PriceGroup(ticker, pricetemp2));
}

XAttribute投射到double将使用适当的数字XML规则(XmlConvert.ToDouble)。使用double.Parse是不正确的,因为它使用特定于文化的数字格式(例如在德国,它需要小数点逗号而不是小数点)。