【问题标题】:LINQ XML Read Elements to variableLINQ XML 读取元素到变量
【发布时间】:2014-11-05 01:00:50
【问题描述】:

我正在尝试将此 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>

我查看了一些示例,但没有一个保留元素。我也想循环到文件末尾,每次运行只有一个 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 = ROW 2 个元素

【问题讨论】:

    标签: c# xml linq


    【解决方案1】:

    使用 .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");
    

    【讨论】:

    • 仅供参考@MC,您的答案 XPath 解决方案:P 作为 SelectNode 和 SelectSingleNode 的参数需要 XPath 字符串。
    • @Tyress 好的,我把它们弄混了。那你的方法是什么(使用XElement)?
    • XElement 在 LINQ to XML 下,所以它可能是“LINQ”方法。
    【解决方案2】:

    基本上,您可以使用 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
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-12
      • 2021-11-28
      相关资源
      最近更新 更多