Чтение XML в DataSet - PullRequest
       18

Чтение XML в DataSet

0 голосов
/ 15 апреля 2009

Это мой XML-файл:

<?xml version="1.0" standalone="no" ?> 
<!-- This file represents The Details of the user and the responces: --> 
<Survey>
  <Clientdetails>
    <ClientName xmlns="yash" /> 
    <ClientCompanyName xmlns="lnt" /> 
    <ClientTelNo. xmlns="546" /> 
    <ClientMobileNo xmlns="56" /> 
    <ClientEMail xmlns="56" /> 
  </Clientdetails>
  <ClientResponces>
    <Question1>
      <responce>1</responce> 
    </Question1>
    <Question2>
      <responce>2</responce> 
    </Question2>
    <Question3>
      <responce>3</responce> 
    </Question3>
    <Question4>
      <responce>3</responce> 
    </Question4>
    <Question5>
      <Question5.1>
        <responce>3</responce> 
      </Question5.1>
      <Question5.2>
        <responce>3</responce> 
      </Question5.2>
      <Question5.3>
        <responce>2</responce> 
      </Question5.3>
      <Question5.4>
        <responce>3</responce> 
      </Question5.4>
      <Question5.5>
        <responce>3</responce> 
      </Question5.5>
      <Question5.6>
        <responce>3</responce> 
      </Question5.6>
      <Question5.7>
        <responce>3</responce> 
      </Question5.7>
      <Question5.8>
        <responce>2</responce> 
      </Question5.8>
      <Question5.9>
        <responce>1</responce> 
      </Question5.9>
      <Question5.10>
        <responce>2</responce> 
      </Question5.10>
      <Question5.11>
        <responce>0</responce> 
      </Question5.11>
      <Question5.12>
        <responce>0</responce> 
      </Question5.12>
      <Question5.13>
        <responce>0</responce> 
      </Question5.13>
      <Question5.14>
        <responce>0</responce> 
      </Question5.14>
      <Question5.15>
        <responce>0</responce> 
      </Question5.15>
      <Question5.16>
        <responce>0</responce> 
      </Question5.16>
      <Question5.17>
        <responce>0</responce> 
      </Question5.17>
    </Question5>
  </ClientResponces>
</Survey>

Я хочу прочитать эти данные в DataSet. Я хочу получить только ответы от клиента, а для 5-го вопроса я хочу получить среднее из 17 подвопросов.

Например, DataSet должен содержать только это:

1
2
3
3
4

Как это сделать в C #?

Ответы [ 2 ]

3 голосов
/ 15 апреля 2009

Этот xml довольно ... ужасен. Моим первым предложением было бы запустить его через преобразование xslt, чтобы получить что-то более нормальное, которое можно загрузить с помощью Load. В настоящее время он злоупотребляет пространствами имен ужасно .

В качестве альтернативы, забудьте DataSet и проанализируйте его с XmlDocument или аналогичным.

Вот подход, использующий XmlDocument (и использующий LINQ только для среднего значения, чтобы сохранить несколько строк кода):

XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
foreach (XmlElement el in doc.SelectNodes("//responce")) {
    Console.WriteLine(el.ParentNode.Name + "=" + el.InnerText);
}
XmlNodeList fiveAnswers = doc.SelectNodes(
      "/Survey/ClientResponces/Question5/*/responce");
double avg = fiveAnswers.Cast<XmlElement>()
     .Average(el => int.Parse(el.InnerText));
Console.WriteLine(avg);

Например, normal xml:

<question num="1">
  <response>1</response>
</question>
...
<question num="5">
  <response num="1">1</response>
  <response num="2">3</response>
  ...
</question>

или что-то сопоставимое. Не используйте имя элемента для определения личности.

1 голос
/ 15 апреля 2009

Попробуйте

 XmlDataDocument doc = new XmlDataDocument();
doc.LoadXml(<your string>);
DataSet ds = doc.DataSet;

Затем можно использовать LINQ для выбора отличного от документа.

обновление

 foreach (XmlNode node in doc.SelectNodes("\\Survey\ClientResponses"))
  {
     string text = node.InnerText;
  }

(не проверено! Ваши вложенные дела будут хитрыми!)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...