Как импортировать / читать данные из файла XML? - PullRequest
2 голосов
/ 19 марта 2011

Как получить доступ к XML-файлу в C #? Как посчитать количество узлов в этом XML-файле? Как я должен получить доступ к каждому узлу в этом XML-файле?

У меня есть два xml-файла, один из которых - dev.xml с этим кодом

<Devanagri_to_itrans>
  <mapping>
    <character>अ</character>
    <itrans>a</itrans>
  </mapping>
  ...
</Devanagri_to_itrans>

второй файл - guj.xml (с очень похожей структурой)

<Gujrathi_to_itrans>
  <mapping>
     <character>અ</character>
     <itrans>a</itrans>
  <mapping>
  ...
</Gujrathi_to_itrans>

Мне нужно превратить это в двумерное размещение отображений персонажей.

Ответы [ 3 ]

2 голосов
/ 19 марта 2011

Попробуйте этот учебник по Linq to XML - http://www.switchonthecode.com/tutorials/introduction-to-linq-simple-xml-parsing

Этот вопрос - Как перебрать XDocument, получить полную структуру XML, объект за объектом? - также предоставляет некоторые интересныекод

1 голос
/ 19 марта 2011

Если вы используете .net 3.5 или новее, используйте LINQ to XML, установив ссылку на System.Xml.Linq.Вот простое количество элементов в данном xml-файле для окна консольного приложения:

string xml = @"<xml><a/><a/><a/></xml>";
XDocument doc = XDocument.Parse(xml);
Console.WriteLine((from a in doc.Descendants("a")
                   select a).Count());
0 голосов
/ 19 марта 2011

Поскольку вы добавили больше деталей, теперь я могу дать лучший ответ. Вот функциональное консольное приложение для синтаксического анализа и объединения xml, которое демонстрирует, что именно вы ищете (я думаю). Для анализа XML-файлов, а не XML-строк, используйте метод XDocument Load, а не отображаемый метод Parse. Удачи,

            XDocument docA = XDocument.Parse(
@"<Devanagri_to_itrans>
  <mapping>
    <character>अ</character>
    <itrans>a</itrans>
  </mapping>
</Devanagri_to_itrans>");
            XDocument docB = XDocument.Parse(
@"<Gujrathi_to_itrans>
  <mapping>
     <character>અ</character>
     <itrans>a</itrans>
  </mapping>
</Gujrathi_to_itrans>");
            var devanagriKeys = (from d in docA.Descendants("mapping")
                                                  select new {
                                                      Key = d.Descendants("itrans").FirstOrDefault().Value,
                                                      Character = d.Descendants("character").FirstOrDefault().Value
                                                  }).ToArray();
            var gujrathiKeys = (from g in docB.Descendants("mapping")
                                                  select new {
                                                      Key = g.Descendants("itrans").FirstOrDefault().Value,
                                                      Character = g.Descendants("character").FirstOrDefault().Value
                                                  }).ToArray();
            var crossReference = (from d in devanagriKeys
                                  join g in gujrathiKeys on d.Key equals g.Key
                                  select new {
                                        d.Key,
                                        Devanagri = d.Character,
                                        Gujrathi = g.Character
                                    }).ToList();
            Console.WriteLine("Enter a key character to translate:");
            string searchKey = Console.ReadLine();
            var translation = crossReference.Where(cr => cr.Key == searchKey).FirstOrDefault();
            if (translation == null) 
                Console.WriteLine("No such key in the cross reference.");
            else
                Console.WriteLine("{0} is {1} in Devanagri and {2} in Gujrathi", 
                    translation.Key, translation.Devanagri, translation.Gujrathi);
            Console.ReadKey(true);

ЗА ЗАПРОС ПЕРЕМЕННОЙ СЕССИИ:

Анонимные типы предназначены только для использования внутри метода. Чтобы поместить список в переменную Session для использования в другом месте, создайте собственный реальный класс, который содержит 3 требуемых свойства, и измените приведенную выше строку кода так, чтобы она соответствовала приведенной ниже. (Название класса, которое я выбрал, было CrossReferenceTranslation.)

        Session["CrossReference"] = (from d in devanagriKeys
                              join g in gujrathiKeys on d.Key equals g.Key
                              select new CrossReferenceTranslation() {
                                    d.Key,
                                    Devanagri = d.Character,
                                    Gujrathi = g.Character
                                }).ToList();

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

List<CrossReferenceTranslation>() crossReference = Session["CrossReference"] ?? 
   new List<CrossReferenceTranslation>();
...