【问题标题】:How can i correctly output XML-data with ExecuteXmlReader如何使用 ExecuteXmlReader 正确输出 XML 数据
【发布时间】:2024-05-29 13:30:02
【问题描述】:

我有一个 ASP.NET 4.0 应用程序,我尝试使用 SQLCommand 类中的函数 ExecuteXmlReader 来获取 XML 结果。查询不会产生任何错误。查询以FOR XML AUTO, ELEMENTS, ROOT('root') 结束。但是当我尝试这个时:

Dim XML As XElement = XElement.Load(query.ExecuteXmlReader)
XML.Save(HttpContext.Current.Server.MapPath("~/Result.xml"))

我收到此错误消息:

XmlReader 必须位于 Element 类型的节点上,而不是 None 类型的节点上。(英文翻译)

Der XmlReader muss sich auf einem Knoten vom Typ 'Element' befinden, nicht auf einem Knoten vom Typ 'None'。(德语翻译)

奇怪的是错误出现在XElement.Load(query.ExecuteXmlReader)那一行。但是代码运行得更远!它还将 xml 数据保存到磁盘!这怎么会发生,我怎样才能读出 xml-result 而不会出错?

【问题讨论】:

  • 如果你把错误信息翻译成英文会有帮助
  • 我认为错误的英文翻译是:“XmlReader 必须位于 Element 类型的节点上,而不是 None 类型的节点上。”

标签: sql .net xml


【解决方案1】:

我在读取多个 FOR XML AUTO 语句时遇到了类似的问题。 将 XmlReader 传递给 System.Xml.XPath.XPathDocument 解决了问题:

 public static XDocument MultipleNodes(XmlReader reader, string RootName = "Root")
    {
        var doc = new XDocument(new XElement(RootName));

        var xn = new XPathDocument(reader).CreateNavigator();
        XPathNodeIterator iterator = xn.Select("/*");   // Level 1 multiple Elements
        foreach (XPathNavigator item in iterator)
        {
            doc.Root.Add(XElement.Load(item.ReadSubtree()));
        }

        return doc;
    }

【讨论】: