寻找使用c#组织xml流的更好方法

时间:2011-11-18 15:57:24

标签: c# .net xml xml-serialization

我有一个从Web服务返回的xml流,它通过HttpWebResponse进入。目前我正在将xml加载到XmlTextReader中,然后循环遍历节点以获取变量。这是有效的,但是非常笨拙,因为某些子节点包含的数据会影响我如何组织它之前的数据。据我所知,XmlTextReader只是迭代和正向读取。因此,如果子节点x包含可能会影响父节点a的数据,那么当我到达子节点x时,我已经通过父节点读取了这一点,整个过程非常令人头疼。

我在.net中使用xml相对较新...是否有更好的方法来解决这个问题?我想大声思考,我希望能够将入站xml流读入一个对象,我可以说:在所有节点x中显示所有内容:然后将它们设置为一个类。基于它们是什么,好吧,我应该在节点a的所有内容....等等。换句话说,不是正向阅读方法,而是更多的自上而下的整个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 for,它的工作正常。我只是对嵌套数据有疑问。我从xml中获取的最后一个元素,“ProductAlignment”实际上有子节点,我需要以可读格式解析。所以现在,以我的代码的方式,它采用ProductAlignment中的所有子元素,并在将整个事物数据绑定到gridview时将它们混合在一个单元格中。如何将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 个答案:

答案 0 :(得分:4)

你可以使用linq to xml with following ...

  1. 使用XDocument.Load method
  2. 加载文档
  3. 然后,您可以使用XDocument方法按指定的here
  4. 访问您的节点
  5. 或者如果需要,您还可以使用XPathSelectElement方法对文档执行旧的xpath查询。
  6. 这种方法可以让你以任何方向遍历整个文档的内存......

答案 1 :(得分:1)

您正在寻找LINQ to XML