Чтение XML-файла и выбор узлов в .NET - PullRequest
1 голос
/ 11 февраля 2010

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

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

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

Ответы [ 4 ]

1 голос
/ 14 февраля 2010
  1. Убедитесь, что вы добавили ссылку на "System.xml.Linq '.
  2. Высосать все элементы диеты:

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

  4. Теперь перебираем dietElements, чтобы добавить каждый элемент и / или детей в вашу базу данных: "foreach (XElement x in dietElements) {...}"

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

<?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>
0 голосов
/ 11 февраля 2010

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

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

0 голосов
/ 11 февраля 2010

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

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

Надеюсь, это поможет,

0 голосов
/ 11 февраля 2010

В 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...