2012-05-14 3 views
-1

У меня есть XML-файл, подобный этому.LINQ to XML Получить все имена узлов из файла

Parent 
-Value 
-Value 
-Child 
--Value 
--Value 
---Grandchild 
----Value 
---GrandchildEND 
-ChildEND 
-Value 
-Child2 
...... 

Структура файла XML является переменной. Значит, у каждого XML есть разные Childs, Grandchilds и т. Д. Я хочу открыть XML-файл и ввести данные из XML-файла в базу данных MYSQL.

Здесь код, который я использую для открытия XML и ввода информации в MySQL.

   while (hardcore < 50000) 
      { 
       try 
       { 
        XDocument xmlDoc2 = XDocument.Load("c:\\a.xml"); 
        var simpleQuery2 = (from Mainparent in xmlDoc2.Descendants("Mainparent") 
             select Mainparent).FirstOrDefault(); 
        dbcon.Insert 
         (
         simpleQuery2.Element("id").Value, 
         simpleQuery2.Element("action").Value, 
         simpleQuery2.Element("ordernr").Value, 
         simpleQuery2.Element("typ").Value, 
         simpleQuery2.Element("orderdate").Value, 
         simpleQuery2.Element("p4code").Value, 
         simpleQuery2.Element("runtime").Value, 
         ); 
       } 
       catch (NullReferenceException) 
       { 
        textBox1.Text = "did a stupid mistake mofo"; 
       } 
       hardcore++; 
      } 

информацию из "simpleQuery2.Element (" ID "). Значение" представляет собой значение, которое хранится в MainParent.

Моя проблема в настоящее время:

Я не могу быть уверен, какие значения/Чайлдс/.. есть внуков в файле XML. Чтобы успешно импортировать его в MySQL, мне нужно будет импортировать все элементы по каждому из них, иначе я получаю сообщение об ошибке, и импорт не работает.

Мне нужно знать Parent/Valuename/Value или Parent/Child/Valuename/value. , потому что Parent/Valuename/Value будут импортированы в таблицу «PARENT» , а родитель/ребенок/имя_валюты/значение будут импортированы в таблицу «CHILD».

Если я знаю, какие дети/внуки, я знаю, какие значения ожидать.

Я уже могу получить полный список элемента с:

  XDocument xmlDoc2 = XDocument.Load("c:\\a.xml"); 
     foreach (var name in xmlDoc2.Root.DescendantNodes().OfType<XElement>() 
       .Select(x => x.Name).Distinct()) 
     { textBox1.Text = textBox1.Text + "\r\n"+name; } 
+1

Так [Что вы пробовали] (http://mattgemmell.com/2008/12/08/what-have-you-tried/), чтобы сделать в коде (покажите нам код, пожалуйста)? –

+0

Вы должны быть конкретными в том, что вы просите. Покажите нам XML. Покажите нам, что вы хотите выбраться из него. Покажите нам, что вы пробовали. – yamen

+0

Я попытался получить список узлов с помощью xelement, но этот вид не работал. поскольку он говорит мне, что xmlDoc2.Attributes() невозможен. Извините, не могу опубликовать XML, так как у меня нет на самом деле одного. Я просто получил описание структуры. – mahxds

ответ

0

Чтобы получить все узлы XML, просто используйте:

XmlDocument xml_doc = new XmlDocument(); 
xml_doc.Load(something); 
XmlNodeList list = xml_doc.SelectNodes("//*"); 

Если вы хотите что-то больше, просто модифицировать XPath выражение :).

+0

Привет, я попытался сделать это, как вы сказали, но я получаю только «System.Xml.XPathNodeList». мой код «XmlDocument xml_doc = новый XmlDocument(); xml_doc.Load ("c: \\ a.xml "); XmlNodeList list = xml_doc.SelectNodes (" MainParent "); textBox1.Text = list.ToString();' – mahxds

0

Ваш вопрос по-прежнему немного расплывчатый. Причина, по которой я чувствую, что все еще немного расплывчата, состоит в том, что вы заявляете, что каждый XML отличается, но я не уверен, как это относится к потоку родителя/ребенка/....

var nodeNames = XDoucment.root.Descendants() 
           .Select(e => e.Name.Localname) 
           .Distinct() 
           .ToList() 

Этот код даст вам список все отчетливые имена узлов в файле XML.

Я ответил на аналогичный вопрос титулованных Reading dynamic elements from the xml file using c#`

+0

Привет, спасибо за вашу помощь. Но я также просто получаю все перечисленные узлы. ' XDocument xmlDoc2 = XDocument.Load ("C: \\ a.xml"); вар nodeNames = xmlDoc2.Root.Descendants() .Select (а => eh.Name.LocalName) .distinct() .ToList(); listBox1.Items.AddRange (nodeNames.ToArray()) ;, но я хотел бы иметь дочерние узлы в сочетании с их родительскими узлами. Item = Родительский элемент 2 = Partent/childXY item 3 = Parent/ChildXY/GrandchildZHU item 4 = Parent/ChildSD – mahxds