Ищете лучший подход к организации потока XML с использованием C # - PullRequest
2 голосов
/ 18 ноября 2011

У меня есть поток XML, возвращаемый из веб-сервиса, который приходит через HttpWebResponse.В настоящее время я загружаю xml в XmlTextReader, а затем перебираю узлы, чтобы получить переменные.Это работает, но крайне громоздко, поскольку некоторые дочерние узлы содержат данные, которые влияют на то, как я организую данные, которые предшествуют этому.Насколько мне известно, XmlTextReader является итеративным и предназначенным только для чтения.Поэтому, если дочерний узел x содержит данные, которые потенциально могут повлиять на родительский узел a, я уже прочитал родительский узел a к тому времени, когда доберусь до дочернего узла x, и все это - огромная головная боль.

IЯ относительно новичок в работе с XML в .net ... Есть ли лучший способ подойти к этому?Думаю, подумав вслух, я хотел бы иметь возможность читать входящий поток XML в объект, где я могу сказать: показать мне все во всех узлах x: затем установить их в класс.Исходя из того, что они есть, хорошо, я должен все в узле а .... и т. Д., И т. Д. Другими словами, не метод прямого чтения, а скорее взгляд сверху вниз на весь контент XML.Это возможно?

Вот пример кода о том, как я сейчас его обрабатываю:

HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream responseStream = response.GetResponseStream();
XmlTextReader reader = new XmlTextReader(responseStream);

while (reader.Read())
{
    if (reader.Name == "Whatever")
        {
            var = reader.ReadString();
            reader.Read();

... и т. Д. И т. Д. До конца xml.

Хорошо,Я думаю, что я почти там, мне просто нужно немного больше помощи.Ниже мой новый код, для которого я использую Linq to XML, и он работает нормально.У меня просто вопрос по вложенным данным.Последний элемент, который я получаю из xml: «ProductAlignment» на самом деле имеет дочерние узлы, которые мне нужно проанализировать в читаемом формате.Итак, прямо сейчас, с моим кодом, таким, какой он есть, он берет все дочерние элементы в ProductAlignment и смешивает их вместе в одной ячейке, когда я связываю все это с видом сетки.Как я могу запросить дочерние элементы в ProductAlignment к более читаемому формату?

HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream responseStream = response.GetResponseStream();
XDocument xdoc = XDocument.Load(XmlReader.Create(responseStream));
var People= from Person in xdoc.Descendants("Person")
                          where Person.Element("Role").Value != "Admin"
                          orderby Person.Element("Role").Value
                          select new
                          {
                              Role= Person.Element("TerritoryRole").Value,
                              FirstName = Person.Element("FirstName").Value,
                              LastName = Person.Element("LastName").Value,
                              ProductAlignment = Person.Element("ProductAlignment").Value
                          };

        gvTest.DataSource = People;
        gvTest.DataBind();

Ответы [ 2 ]

4 голосов
/ 18 ноября 2011

Вы можете использовать linq to xml со следующими ...

  1. загрузить документ, используя метод XDocument.Load
  2. Затем вы можете использовать методы XDocument, чтобы добраться до ваших узлов, как указано здесь
  3. или вы также можете использовать метод XPathSelectElement для выполнения старых запросов xpath к документу, если хотите.

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

1 голос
/ 18 ноября 2011

Вы ищете LINQ to XML .

...