2014-11-05 68 views
1

我想将这个xml文件读入到C#中变成一个变量或一组变量。LINQ XML读取元素到变量

<ROWSET> 
    <ROW num="1"> 
    <USER_ID></USER_ID> 
    <FIRST_NAME>Timothy</FIRST_NAME> 
    <MIDDLE_NAME></MIDDLE_NAME> 
    <LAST_NAME>Scott</LAST_NAME> 
    <EMPLOYEE_NO>99</EMPLOYEE_NO> 
    <HOME_PHONE></HOME_PHONE> 
    <EMPLOYEE_STATUS_>T</EMPLOYEE_STATUS_> 
    <HIRE_DATE>01/01/01</HIRE_DATE> 
    <DEPARTMENT>Engineering</DEPARTMENT> 
    <POSITION>Controls Engineer</POSITION> 
    <SHIFT>N</SHIFT> 
    <REPORTS_TO>Everhart,Robert</REPORTS_TO> 
    <PAY_TYPE>H</PAY_TYPE> 
    <EMPLOYEE_TYPE>R</EMPLOYEE_TYPE> 
    <TERMINATION_DATE>value</TERMINATION_DATE> 
    <PCN_CODE>stuff-RV</PCN_CODE> 

    </ROW> 
    <ROW num="2"> 
    <USER_ID>RV100707</USER_ID> 
    <FIRST_NAME>Jan</FIRST_NAME> 
    <MIDDLE_NAME>G</MIDDLE_NAME> 
    <LAST_NAME>Pot</LAST_NAME> 
    <EMPLOYEE_NO>80</EMPLOYEE_NO> 
    <HOME_PHONE></HOME_PHONE> 
    <EMPLOYEE_STATUS_>A</EMPLOYEE_STATUS_> 
    <HIRE_DATE>01/01/01</HIRE_DATE> 
    <DEPARTMENT>Shipping</DEPARTMENT> 
    <POSITION>Shipping Coordinator</POSITION> 
    <SHIFT>2</SHIFT> 
    <REPORTS_TO>Hajkova,Karin</REPORTS_TO> 
    <PAY_TYPE>H</PAY_TYPE> 
    <EMPLOYEE_TYPE>R</EMPLOYEE_TYPE> 
    <TERMINATION_DATE></TERMINATION_DATE> 
    <PCN_CODE>stuff-RV</PCN_CODE> 

我看了几个例子,但没有保留的元素。我也想循环直到文件的结尾,每次运行只有一行。因此,另一个函数可以获取这些值并将它们发送到他们需要去的地方。

例如: ROW元素: 循环直到XML文档的端

<USER_ID></USER_ID> 
<FIRST_NAME>Timothy</FIRST_NAME> 
<MIDDLE_NAME></MIDDLE_NAME> 
<LAST_NAME>McCreary</LAST_NAME> 
<EMPLOYEE_NO>1048</EMPLOYEE_NO> 
<HOME_PHONE></HOME_PHONE> 
<EMPLOYEE_STATUS_>T</EMPLOYEE_STATUS_> 
<HIRE_DATE>05/17/2010</HIRE_DATE> 
<DEPARTMENT>Engineering</DEPARTMENT> 
<POSITION>Controls Engineer</POSITION> 
<SHIFT>N</SHIFT> 
<REPORTS_TO>Everhart,Robert</REPORTS_TO> 
<PAY_TYPE>H</PAY_TYPE> 
<EMPLOYEE_TYPE>R</EMPLOYEE_TYPE> 
<TERMINATION_DATE>07/01/2010</TERMINATION_DATE> 
<PCN_CODE></PCN_CODE> 

上传到HTTP //我有这部分计算出来。

ROW = 2个ROW元件

回答

0

基本上,可以使用的XDocument(using System.Xml.Linq;)解析文档。用法是这样的:你希望把重点放在单个行每次迭代(右?)

XDocument doc = XDocument.Parse(File.ReadAllText("yourfilename.xml")); 
    XElement rowset = doc.Element("ROWSET"); // get the ROWSET element 
    XElement row1 = rowset.Elements("ROW").First(); // get the first child ROW of ROWSET 
    //get the ROW child of ROWSET having attribute num == 2 
    XElement row2 = rowset.Elements().Single(row => row.Attribute("num").Value == "2"); 

当你说你只需要每运行通过一排,我假设。您可以在ROWSET的子ROW元素上使用foreach

foreach (XElement row in rowset.Elements()) 
    { 
     string firstname = row.Element("FIRST_NAME").Value; 
     // etc 
    } 
0

有许多处理使用.NET和C#的XML的方法。

一些我所知道的:

XmlDocument doc = new XmlDocument(); 
doc.LoadXml(File.ReadAllText(@"PathToYourFile\file.xml")); 
XmlNode rowset = doc.SelectSingleNode("/ROWSET"); // <-- This variable provides access to the root XML node 

// The .Cast<> is needed because LINQ works only generic Collections. 
// The .ToList() executes the LINQ query and store the result in a List<> (usually faster than using the IEnumerable<> directly but also higher memory usage) 
List<XmlNode> rows = rowset.SelectNodes("ROW").Cast<XmlNode>().ToList(); 

foreach (XmlNode row in rows) 
{ 
    // access attibutes of row with: 
    string numValue = row.Attributes["num"].InnerText; 

    // access sub-elements of row with: 
    string employeeNo = row.SelectSingleNode("EMPLOYEE_NO").InnerText; 

    // You can even go deeper through an XML hierarchy with: 
    // row.SelectSingleNode("SomeXMLNode/SubNode/NodeOfSubNode").InnerText; 
} 

// Select the 2nd row 
XmlNode secondRow = rows.Single(r => r.Attributes["num"].InnerText == "2"); 
+0

Just FYI @MC,您的答案*是* XPath解决方案:P作为SelectNode和SelectSingleNode的参数需要XPath字符串。 – Tyress 2014-11-12 10:28:17

+0

@Tayress好吧,我把它们混在一起。那你叫什么方法(使用'XElement')然后调用? – 2014-11-17 08:19:55

+0

XElement在LINQ to XML之下,所以它可能是“LINQ”方法。 – Tyress 2014-11-17 08:25:11