LINQ XML Чтение элементов в переменную

1

Я пытаюсь прочитать этот 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 за проход туда. Так что другая функция может захватить эти значения и отправить их туда, где им нужно идти.

Например: элементы 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

Теги:
linq

2 ответа

0

Существует множество способов работы с XML с использованием.NET и С#.

Некоторые из них знают:

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
    Просто FYI @MC, ваш ответ - решение XPath: P в качестве SelectNode и параметры SelectSingleNode ожидают строки XPath.
  • 0
    @Tyress Хорошо, я перепутала их. Как называется ваш метод (с использованием XElement )?
Показать ещё 2 комментария
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"); 

Когда вы говорите, что хотите только одну строку за один проход, я предполагаю, что вы хотите сосредоточиться на одной строке на каждой итерации (правильно?). Вы можете использовать foreach для ROWSET дочерних элементов ROW

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню