2012-01-03 14 views
0

То, что я пытаюсь сделать, - это создать вложенный в List List в основном 2d-список или 2D-массив, если это лучше для этой задачи, который будет работать следующим образом: ID => 1 Name => Hickory без явного выбора узла ,C# XML Parsing, разделяющий innerxml from innertext

Я мог бы использовать SelectNode (Woods/Wood), а затем сделать что-то вроде node["ID"].InnerText, но для этого мне нужно знать, что такое имя узла.

Предположим, что это будет читать wood.xml, даже если было 36 узлов вместо 7 и что я никогда не узнаю имя узлов. Я пробовал использовать outerxml/innerxml, но это дает мне слишком много информации.

XmlDocument doc = new XmlDocument(); 
     doc.Load("wood.xml"); 

     //Here is wood.xml 
     /*<Woods><Wood><ID>1</ID><Name>Hickory</Name><Weight>3</Weight><Thickness>4</Thickness><Density>5</Density><Purity>6</Purity><Age>7</Age></Wood><Wood><ID>2</ID><Name>Soft Maple</Name><Weight>3</Weight><Thickness>4</Thickness><Density>5</Density><Purity>6</Purity><Age>7</Age></Wood><Wood><ID>3</ID><Name>Red Oak</Name><Weight>3</Weight><Thickness>4</Thickness><Density>5</Density><Purity>6</Purity><Age>7</Age></Wood></Woods>*/ 


     XmlNode root = doc.FirstChild; 

     //Display the contents of the child nodes. 
     if (root.HasChildNodes) 
     { 
      for (int i=0; i<root.ChildNodes.Count; i++) 
      { 
       Console.WriteLine(root.ChildNodes[i].InnerXml); 
       Console.WriteLine(); 
      } 

      Console.ReadKey(); 
     } 

Это позволит мне в основном создать дерево «буфер», если вы будете так что я могу получить доступ к этим значения в другом месте.

Извините, если я не понял, я хочу по существу сделать этот «абстрактный» из-за отсутствия лучшего слова.

Так что, если бы я когда-нибудь изменил имя «Вес» на «HowHeavy», или если бы я добавил дополнительный элемент «NumberOfBranches», мне не пришлось бы жестко кодировать структуру xml-файла.

+2

Что вопрос? – tafa

+0

", что я никогда не узнаю имя узлов." Затем, пожалуйста, дайте образец, как вы хотите получить данные. –

+0

Ну, вот что я не знаю, как это сделать. Если я знаю имя узла, я могу использовать SelectSingleNode («ID»). InnerText. То, что я пытаюсь выполнить, - это прочитать XML-файл, не зная, что такое имена узлов. – Windex

ответ

2

Это вы после?

class Program 
    { 
     static void Main(string[] args) 
     { 
      string xml = @"<Woods><Wood><ID>1</ID><Name>Hickory</Name><Weight>3</Weight><Thickness>4</Thickness><Density>5</Density><Purity>6</Purity><Age>7</Age></Wood><Wood><ID>2</ID><Name>Soft Maple</Name><Weight>3</Weight><Thickness>4</Thickness><Density>5</Density><Purity>6</Purity><Age>7</Age></Wood><Wood><ID>3</ID><Name>Red Oak</Name><Weight>3</Weight><Thickness>4</Thickness><Density>5</Density><Purity>6</Purity><Age>7</Age></Wood></Woods>"; 

      XDocument doc = XDocument.Parse(xml); 
      //Get your wood nodes and values in a list 
      List<Tuple<string,string>> list = doc.Descendants().Select(a=> new Tuple<string,string>(a.Name.LocalName,a.Value)).ToList(); 

      // display the list 
      list.All(a => { Console.WriteLine(string.Format("Node name {0} , Node Value {1}", a.Item1, a.Item2)); return true; }); 
      Console.Read(); 
     } 
    } 
+0

Это именно то, что я пытаюсь сделать. Есть ли способ сделать это без использования Linq? – Windex

+1

@Windex да, можно увидеть ответ «Джошуа Миллс», но он слишком подробный, так что наслаждайтесь Linq;) http://stackoverflow.com/questions/847978/c-sharp-how-can-i-get-all- элементы-имя-с-а-XML-файл –

1

Вы можете использовать xmlDocument.SelectNodes("//child::node()")