c# - 寻找一种更好的方法来使用 C# 组织 xml 流

标签 c# .net xml xml-serialization

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

我对在 .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,并且它工作正常。我只是有一个关于嵌套数据的问题。我从 xml 中获取的最后一个元素“ProductAlignment”实际上具有我需要以可读格式解析的子节点。所以现在,按照我的代码的方式,它会获取 ProductAlignment 中的所有子元素,并在我将整个元素数据绑定(bind)到 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();

最佳答案

您可以使用 linq to xml 进行以下操作...

  1. 使用 XDocument.Load method 加载文档
  2. 然后您可以使用 XDocument 方法来访问您的节点,如指定的 here
  3. 或者,如果需要,您也可以使用 XPathSelectElement 方法对文档执行旧的 xpath 查询。

这种方法可以让你在任何方向上遍历,但代价是整个文档都在内存中......

关于c# - 寻找一种更好的方法来使用 C# 组织 xml 流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8185185/

相关文章:

c# - 这是 dotnet Regex-Parser 中的错误吗?

.net - 如何判断文件传输何时完成(服务器到客户端)

java - 如何将 html 注释添加到 jsoup 注释中

php - 是否可以使用 simplexml 将注释标记插入到 xml 中?

c# - lambda 表达式中的 Where 条件 c#

javascript - 如何在我的 aspx 页面上显示变量值后面的代码

c# - 如何最大化单个 TCP 套接字的吞吐量?

java - 如何在具有默认命名空间的 xml 文档上使用 XPath

c# - 将富文本文档保存到 Windows 应用商店应用程序中的临时文件夹

c# - WCF 使用匿名方法关闭连接