C# LINQ XML将元素读取到变量

C# LINQ XML将元素读取到变量,c#,xml,linq,C#,Xml,Linq,我试图将这个xml文件读入C#中,读入一个变量或一组变量 <ROWSET> <ROW num="1"> <USER_ID></USER_ID> <FIRST_NAME>Timothy</FIRST_NAME> <MIDDLE_NAME></MIDDLE_NAME> <LAST_NAME>Scott</LAST_NAME> &

我试图将这个xml文件读入C#中,读入一个变量或一组变量

<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>

提摩太
斯科特
99
T
01/01/01
工程
控制工程师
N
艾弗哈特,罗伯特
H
R
价值
填充房车
RV100707
简
G
锅
80
A.
01/01/01
航运
船务协调员
2.
哈伊科娃,卡林
H
R
填充房车
我看了一些例子,但没有一个保留了元素。我还想循环到文件的末尾,在那里每次只运行一行。因此,另一个函数可以获取这些值并将它们发送到需要的位置

例如: 行元素: 循环直到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>

提摩太
麦克里
1048
T
05/17/2010
工程
控制工程师
N
艾弗哈特,罗伯特
H
R
07/01/2010
上传到HTTP//我已经解决了这部分问题


ROW=row2元素基本上,您可以使用XDocument(
使用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"); 
当你说你只希望每次运行一行时,我假设你希望每次迭代只关注一行(对吗?)。可以对行集的子行元素使用foreach

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

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

据我所知:

  • LINQ到XML(类似)
  • XML序列化(请参阅:)
  • 我在这里展示的方式(XPath):
XmlDocument doc=新的XmlDocument();
doc.LoadXml(File.ReadAllText(@“pathtoyurfile\File.xml”);
XmlNode rowset=doc.SelectSingleNode(“/rowset”);//r、 属性[“num”]。InnerText==“2”);

仅供参考@MC,您的答案是XPath解决方案:P作为SelectNode,SelectSingleNode的参数需要XPath字符串。@Tyres Ok,我把它们弄混了。那么您的方法(使用
XElement
)调用了什么?XElement在LINQ to XML下,所以它可能是“LINQ”方法。
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");