2010-03-24 4 views
2

я работал с определенным XML, где не было никаких увольненийИзбежание Увольнение в XML-документах

<person> 
    <eye> 
    <eye_info> 
     <eye_color> 
     blue 
     </eye_color> 
    </eye_info> 
    </eye> 
    <hair> 
    <hair_info> 
     <hair_color> 
     blue 
     </hair_color> 
    </hair_info> 
    </hair> 
</person> 

Как вы можете видеть, суб-тег цвет глаз делает ссылку на глаз в его имя, так что не было нет необходимости, чтобы избежать дублирования, я не мог получить цвет глаз в одной строке после загрузки XML в набор данных:

dataset.ReadXml(path); 
value = dataset.Tables("eye_info").Rows(0)("eye_color"); 

Я понимаю, что это не самый умный способ сделать это, и эта ситуация у меня теперь не было непредвиденным.

Теперь, скажем, я должен читать XML, которые находятся в этом формате:

<person> 
    <eye> 
    <info> 
     <color> 
     blue 
     </color> 
    </info> 
    </eye> 
    <hair> 
    <info> 
     <color> 
     blue 
     </color> 
    </info> 
    </hair> 
</person> 

Так что если я пытаюсь вызвать его, как это:

dataset.ReadXml(path); 
value = dataset.Tables("info").Rows(0)("color"); 

Там будет избыточность, потому что Я мог бы зайти только на один уровень, чтобы идентифицировать одно поле в XML с моим предыдущим методом, а «disambiguator» - это три уровня выше.

Есть ли практический способ достичь без ошибок одного поля, заданного всем вышеперечисленным (или хотя бы несколькими) полями?

- [EDIT] -

Я сделал еще один вопрос с вопросом, как я мог получить определенный узел с помощью LINQ, check it out.

ответ

4

Вы также можете использовать Linq для XML (System.Xml.Linq пространства имен) и получить данные что-то вроде этого

string xml = @"<persons> 
<person> 
    <eye> 
    <info> 
     <color>blue</color> 
    </info> 
    </eye> 
    <hair> 
    <info> 
     <color>blonde</color> 
    </info> 
    </hair> 
</person> 
<person> 
    <eye> 
    <info> 
     <color>green</color> 
    </info> 
    </eye> 
    <hair> 
    <info> 
     <color>brown</color> 
    </info> 
    </hair> 
</person> 
</persons>"; 

XDocument document = XDocument.Parse(xml); 

var query = from person in document.Descendants("person") 
      select new 
      { 
       EyeColor = person.Element("eye").Element("info").Element("color").Value, 
       HairColor = person.Element("hair").Element("info").Element("color").Value 
      }; 

foreach (var person in query) 
    Console.WriteLine("{0}\t{1}", person.EyeColor, person.HairColor); 
+0

Я бы пошел с Linq в Xml, это вполне естественно. –

+0

Спасибо, у меня была проблема при попытке его использовать .. проверьте обновление – Marcelo

2

Существует целый стандарт, связанный с запросом данных из документа XML. Стандарт называется XPath, а C# имеет реализацию. Это не самая легкая вещь, чтобы узнать из коробки, но это один из лучших методов для извлечения данных из XML и хорошо изучать.

Here - пример.

EDIT: Я бы порекомендовал вам выяснить LINQ to XML, но поскольку он более мощный, но если вы все еще хотите XPath, то ваш конкретный вопрос будет выглядеть примерно так (у меня нет VS на этом компьютере, поэтому я не мог проверить это) ...

XPathDocument doc = new XPathDocument(new StringReader(xmlString)); 
XPathNavigator nav = doc.CreateNavigator(); 

// Compile a standard XPath expression 
XPathExpression expr = nav.Compile("/person/eye/eye_info/eye_color"); 
expr = nav.Compile("/catalog/cd/price"); 
XPathNodeIterator iterator = nav.Select(expr); 

// Iterate on the node set 
while (iterator.MoveNext()) 
{ 
    XPathNavigator nav2 = iterator.Current.Clone(); 
    Console.WriteLine(nav2.Value); 
} 
+0

Я попробую xpath! не могли бы вы показать мне пример? проверьте обновление в вопросе – Marcelo

+0

. Для ознакомления с общим представлением XPath см. http://www.w3schools.com/xpath/default.asp. В .Net XPath доступен с помощью методов SelectNode и SelectNodes объектов XmlNode и их потомков (т. Е. XmlDocument). – Martin

0

Помните, что DataSet класс может только понять XML которые могут быть переведены в форму реляционной базы данных. В частности, он не будет обрабатывать одну дочернюю «таблицу», которая имеет несколько родительских «таблиц». Примером этого является элемент «info» как ребенок как человека, так и волос и глаз.

Смежные вопросы