как читать сложный XML-файл

#c# #sql-server #xml #linq-to-xml

#c# #sql-сервер #xml #linq-to-xml

Вопрос:

У меня есть следующий XML-файл

     <departments>
      <dept operationalStatus="active" primaryRole="Admin" depChangeDate="20130420">        
        <startDate type="legal">20130401</startDate>
        <endDate type="legal"></endDate>
        <startDate type="operational">20130320</startDate>
        <endDate type="operational"></endDate>  
      <DeptRoles>           
        <DeptRole name="Other dept" status="active">
            <startDate type="legal">20130401</startDate>
            <endDate type="legal"></endDate>
            <startDate type="operational">20130320</startDate>
            <endDate type="operational"/>
            <isPrimary/>                
        </DeptRole>
      </DeptRoles>
    </dept>
   </departments>
 

у меня есть около 200 тысяч записей для загрузки в базу данных из XML-файла. я хотел бы получить следующие данные из xml-файла в одной таблице
OperationalStatus, primaryRole, depChangeDate, StartDate type legal и его значение и StartDate type operational и его значение
. я могу получить доступ к элементу StartDate type legal, но не могу получить доступ к StartDate type operational.
и следующие данные из элемента управления переносятся в другую таблицу.
Имя, статус, тип начальной даты legal и его значение и тип начальной даты operational и его значение.
Каков наилучший подход и как я могу это сделать?
В основном я сталкиваюсь с проблемой доступа к следующим значениям

     <startDate type="legal">20130401</startDate>
<endDate type="legal"></endDate>
<startDate type="operational">20130320</startDate>
<endDate type="operational"></endDate>  
 

Комментарии:

1. Как вы пытались получить доступ к этим ценностям?

2. @DanielKelley автор: if (эл.Элемент(«Дата начала»). Атрибут («тип»). toString() == «легальный»

3. @DanielKelley если (эл.Элемент(«Начальная дата»). Атрибут («тип»). toString() == «рабочий»

4. @DanielKelley юридическое значение является успешным, но работоспособным, если утверждение никогда не является истинным

Ответ №1:

помогает ли это?

 string data = "<your xml data>";
XElement elem = XElement.Parse(data);

var departments = elem.Descendants("dept").ToList();
foreach (var dept in departments)
{
    var sLegal = dept.Elements("startDate")
            .First(p => p.Attribute("type").Value == "legal").Value;
    var eLegal = dept.Elements("endDate")
            .First(p => p.Attribute("type").Value == "legal").Value;
    var sOp = dept.Elements("startDate")
            .First(p => p.Attribute("type").Value == "operational").Value;
    var eOp = dept.Elements("endDate")
            .First(p => p.Attribute("type").Value == "operational").Value;
    var attr=dept.Attribute("operationalStatus");
    var opStatus = attr == null ? "" : attr.Value;                
    attr = dept.Attribute("primaryRole");
    var primaryRole = attr == null ? "" : attr.Value;                
    attr = dept.Attribute("depChangeDate");
    var depChangeDate = attr == null ? "" : attr.Value;
    //do something with the values
}
 

Комментарии:

1. Большое вам спасибо за помощь, но как мне добавить остальные атрибуты OperationalStatus, primaryRole, depChangeDate

2. Большое спасибо за вашу помощь. как мне проверить элемент или атрибут, если они присутствуют в данных. например, <IsPrimary/> как мне проверить, присутствует ли он. Поскольку это присутствует не во всех записях. и атрибут, например, OperationalStatus в элементе dept. пожалуйста, помогите мне с этим….

3. используйте dept. Элемент («<имя>») или отдел. Атрибут («<имя>»). если они равны нулю, то они отсутствуют. последние строки кода делают это для атрибутов

Ответ №2:

Доступно несколько вариантов, однако этот вам понравится:

http://blogs.msdn.com/b/cdndevs/archive/2013/09/27/web-essentials-for-visual-studio-open-data-made-simple.aspx

Это позволяет вам «копировать» xml, а затем «вставлять» класс c #. Результатом сериализации или десериализации будет xml, который вы использовали для создания этого класса.

Ответ №3:

Это может быть достигнуто следующими способами

  1. Преобразуйте ваш XML в объект DataSet() и примените LINQ для извлечения требуемых столбцов (или)
  2. Примените XPATH к XmlDocument

—SJ

Комментарии:

1. Примените XPATH к XMLDOM

Ответ №4:

Попробуйте это: Dim doc как XDocument = XDocument .Загрузить («PurchaseOrder.xml «) Xdocument — это класс из системы.Пространство имен Linq, поэтому с этого момента есть способы получить к нему доступ через LINQ.

Ответ №5:

Это будет работать…

   var readAll = from a in xd.Descendants("departments")


                      select new
                      {
                          DeptOperationalStatus = a.Element("dept").Attribute("operationalStatus").Value,
                          DeptPrimaryRole = a.Element("dept").Attribute("primaryRole").Value,
                          DeptChangeDate = a.Element("dept").Attribute("depChangeDate").Value,

                          LegalStartDate = a.Element("dept").Elements("startDate").First(cc => cc.Attribute("type").Value == "legal").Value,
                          LegalEndDate = a.Element("dept").Elements("endDate").First(cc => cc.Attribute("type").Value == "legal").Value,

                          OperationalStartDate = a.Element("dept").Elements("startDate").First(cc => cc.Attribute("type").Value == "operational").Value,
                          OperationEndDate = a.Elements("dept").Elements("endDate").First(cc => cc.Attribute("type").Value == "operational").Value,

                          // Dept Roles

                          DeptRoleName = a.Element("dept").Element("DeptRoles").Element("DeptRole").Attribute("name").Value,
                          DeptRoleStatus = a.Element("dept").Element("DeptRoles").Element("DeptRole").Attribute("status").Value,

                          DeptLegalStartDate = a.Element("dept").Element("DeptRoles").Element("DeptRole").Elements("startDate").First(cc => cc.Attribute("type").Value == "legal").Value,
                          DeptLegalEndDate = a.Element("dept").Element("DeptRoles").Element("DeptRole").Elements("endDate").First(cc => cc.Attribute("type").Value == "legal").Value,

                          DeptOperationalStartDate = a.Element("dept").Element("DeptRoles").Element("DeptRole").Elements("startDate").First(cc => cc.Attribute("type").Value == "operational").Value,
                          DeptOperationalEndDate = a.Element("dept").Element("DeptRoles").Element("DeptRole").Elements("endDate").First(cc => cc.Attribute("type").Value == "operational").Value,



                      };