#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:
Доступно несколько вариантов, однако этот вам понравится:
Это позволяет вам «копировать» xml, а затем «вставлять» класс c #. Результатом сериализации или десериализации будет xml, который вы использовали для создания этого класса.
Ответ №3:
Это может быть достигнуто следующими способами
- Преобразуйте ваш XML в объект DataSet() и примените LINQ для извлечения требуемых столбцов (или)
- Примените XPATH к XmlDocument
—SJ
Комментарии:
Ответ №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,
};