2012-12-17 76 views
3

帮助获取各种级别xml中的值。从xml中获取值(4个级别)

这是XML:

<widgets> 
    <id>95</id> 

    <widget type="1" name="accventas" caption="Ofertas ventas" flags="4"> 
     <service name="pm_venofer_total00001" caption="Pendientes de aceptar" desc="" type="3" detail="1"> 
      <xvalue>20</xvalue> 
      <xcolor>1</xcolor> 
     </service> 
    </widget> 

    <widget type="3" name="today_state" caption="Estado de ventas" flags="4"> 
     <service name="pd_today_orders00001" caption="Pedidos" desc="Nº pedidos del día" type="3" detail="1"> 
      <xvalue>0</xvalue> 
      <xcolor>2</xcolor> 
      <xalert>No se está vendiendo nada</xalert> 
     </service> 

     <service name="pd_today_sales00001" caption="Importe" desc="Importe ventas del día" type="3" detail="1"> 
      <xvalue>0,00</xvalue> 
      <xcolor>2</xcolor> 
      <xalert>No estamos recaudando nada</xalert> 
     </service> 
    </widget> 
</widgets> 

加载的XML,并准备尝试过,但我不能得到你所需要

的各个领域,我需要:

  • ID ,
  • 控件的标题属性,
  • 每个控件的服务,
  • 服务的caption属性,
  • x值,
  • xcolor和xalert,
  • 每个服务

我可以得到所有的部件,像这样的:(我认为两种:EmployeesEmployee

[XmlRoot("widgets")] 
public class Employees 
{ 
    [XmlElement("widget")] 
    public ObservableCollection <Employee> Coleccion { get; set; } 
} 


public class Employee 
{ 
    [XmlAttribute("caption")] 
    public string nombreWidget { get; set; } 
} 

但不喜欢把自己内部的每个插件各自的服务(服务属性),和这些x值,xcolor和xalert内

+1

您是否考虑过使用Linq转XML或XPATH?还是你必须使用'XmlSerializer'? – mipe34

+0

我正在使用LINQ to XML,因为不幸的是XPath目前不支持,并且LINQ没有访问所有标签 – user1909412

回答

0

LinqToXml解决方案:

var xml = XDocument.Parse(Resource1.XMLFile1).Root; 
var parsed = new { 
        Id = xml.Element("id").Value, 
        Widgets = xml.Elements("widget") 
            .Select(w => new 
            { 
             Caption = w.Attribute("caption").Value, 
             Services = w.Elements("service").Select(s => new 
             { 
              Caption = s.Attribute("caption").Value, 
              XColor = s.Element("xcolor").Value, 
              XValue = s.Element("xvalue").Value, 
              XAlert = s.Element("xalert") != null ? s.Element("xalert").Value : null 
             }).ToList() 
            }).ToList() 
       }; 

它将创建代表您的inpout XML的匿名对象。您可以轻松地将我的代码中的匿名对象替换为您的真实域对象(Employees等)。

+1

完美的解决方案,谢谢! – user1909412

0

你应该使用XPath

using System.Xml.XPath; 

然后做这样的事情:

XPathNavigator nav; 
XPathDocument docNav; 
XPathNodeIterator NodeIter; 
String strExpression; 

// Open the XML. 
docNav = new XPathDocument(@"c:\books.xml"); 

// Create a navigator to query with XPath. 
nav = docNav.CreateNavigator(); 

// Find the average cost of a book. 
// This expression uses standard XPath syntax. 
strExpression = "sum(/bookstore/book/price) div count(/bookstore/book/price)"; 

有关的一切,可以使用XPath考虑实现的更多信息: https://developer.mozilla.org/en/docs/XPath

+0

我正在使用Window Phone应用程序,因为我需要使用xpath和linq。不幸的是xpath目前不支持。 – user1909412