2010-02-11 1 views
1

У меня есть более тяжелый XML-файл с множеством узлов дерева. Мне нужно забрать какой-то конкретный узел (например, сказать «Диета»), под которым есть несколько разделов.Чтение XML-файла и выбор узлов в .NET.

ie. Узел диеты происходит случайно в XML, поэтому мне нужно найти узел как диету и получить его дочерние элементы и сохранить его в БД.

Предположим, что диета не только одна линия, она имеет 10-12 записей под ним (может быть я могу получить его содержимое с помощью InnerXml, но на самом деле не может получить линию узлов линии)

+0

Пожалуйста, поделитесь своим кодом относительно C#/asp.net – Karthick

+0

Пожалуйста, разместите пример XML, с которым вы работаете. –

ответ

0

В XPath это просто //Diet

Чтобы сказать больше, мне нужно будет узнать больше о вашей среде.

var doc = XDocument.Load("yourfile.xml"); 
var nodes = from d in doc.Desendants("Diet") 
      select d; 

foreach(var node in nodes) 
{ // do stuff with node 
} 
+0

Спасибо, мне нужно закодировать XML в asp.net/C# и вынуть узлы и сохранить значение узла в БД. Пожалуйста, поделитесь некоторыми псевдо/кодами. Спасибо. – Karthick

+0

@ Karthick: то, что он написал, является псевдокодом, который вам нужен, если вам не нужна помощь в сохранении базы данных. В этом случае вам нужно сообщить нам, как вы хотите, чтобы данные отображались в базе данных. –

+0

Спасибо Джеймсу за ваши вкладки и благодарим Джона за ваш комментарий. У меня нелегко завершить это.XML очень большой, и у меня есть XML, и у меня нет XSD для просмотра XML в браузере, поэтому я просматриваю в блокноте, а псевдо-код Джеймса замечательный, он работает для простых XML-файлов, но XML-код очень удобен большая часть вложенных и это doc.Desendants («Диета») возвращает null. Можете ли вы немного увеличить код? Заранее спасибо. – Karthick

0

В зависимости от структуры файла XML, вы можете попытаться загрузить его в DataSet (DataSet.ReadXML()) и посмотреть, что DataTable он помещает Diet узлы в ... если он разбирает это нормально, тогда довольно просто прокрутить DataTable и получить все ваши значения узла Diet.

Я написал небольшое игрушечное приложение, которое открывает такой XML-документ, перечисляя все таблицы данных в древовидном представлении, а затем отображая содержимое таблицы в сетке. Файл проекта VS для него - here или только MSI для его установки - here, если вы хотите увидеть, как DataSet анализирует ваш XML-файл.

+0

-1: Это почти никогда не работает, за исключением очень простых форматов XML. Кроме того, есть очень мало причин добавлять накладные расходы на обработку XML в качестве реляционных данных. Кроме того, даже учитывая DataSet, как бы вы предложили ему найти узлы «Diet» и поместить их значение в базу данных? –

+0

Я не согласен, он почти всегда работает - я разместил полный источник приложения, которое это делает, и код прост и понятен. Вы на самом деле пытались это сделать, или просто downvote для этого? –

+0

Спасибо Ron за входные данные, когда я выбираю свой XML-файл для тестирования, он сообщает, что отношение происходит в более чем двух экземплярах. Я не знаю, есть ли какая-то проблема в файле XML. – Karthick

0

Псевдокод ниже содержит инструкцию XPath, которая предоставит вам все элементы, у которых есть «диета» в качестве родителя. Поскольку он создает XmlNodeList, вы можете ходить по каждому узлу и сохранять его в БД. Для повышения производительности я хотел бы рассмотреть консолидации, что вы хотите сохранить, а затем сохранить его, а не на линию (туда и обратно для каждой записи является неоптимальным)

XmlNodeList list = xDoc.DocumentElement.SelectNodes("//*[parent::Diet]"); foreach (XmlNode entry in list) { DAL.SaveToDatabase(entry); }

Надеется, что это помогает,

1
  1. Убедитесь, что вы добавили ссылку на «System.Xml.Linq»
  2. Suck все элементы Диета:.

    XElement wholeFile = XElement.Load(@"C:\DietSampleXML.xml"); 
    IEnumerable<XElement> dietElements = wholeFile.Descendants("Diet"); 
    
  3. Если вы установили точку останова и наведите указатель мыши на «dietElements» и нажмите «Просмотр результатов», вы увидите все элементы диеты и их внутренний xml.

  4. Теперь перебирать dietElements для добавления каждого элемента и/или детей к базе данных: «Еогеасп (XElement х в dietElements) {...}»

Я проверил это с помощью следующего файла:

<?xml version="1.0" encoding="utf-8" ?> 
<TestElement> 
    <Diet> 
    <Name>Atkins</Name> 
    <Colories>1000</Colories> 
    </Diet> 
    <TestElement2> 
    <Diet> 
     <Name>Donuts Only</Name> 
     <Calories>1500</Calories> 
    </Diet> 
    </TestElement2> 
    <TestElement3> 
    <TestElement4> 
     <Diet> 
     <Name>Vegetarian</Name> 
     <Calories>500</Calories> 
     </Diet> 
    </TestElement4> 
    </TestElement3> 
</TestElement> 
Смежные вопросы