如何使用System.IO.Stream和LINQ读取XML文件

6

我将像这样传递xml文件:

File1.PostedFile.InputStream 

//reading xml file.....
public static void readXMLOutput(Stream stream)
{

    System.Xml.Linq.XDocument xml = System.Xml.Linq.XDocument.Load(stream);

    var query = from p in xml.Element("ste").Element("Application")
                //where (int)p.Element("Id") == 1
                select Page;

    foreach (var record in query)
    {
        Response.Write("dfe") + record.Element("dfe").Value;
    }

错误:

错误 1:'System.Xml.Linq.XDocument.Load(string)' 的最佳重载方法存在一些无效的参数

无法将'System.IO.Stream'转换为'string'

2个回答

16

你是否使用的是 .NET 3.5?XDocument.Load(Stream) 方法只支持 .NET 4 及以上版本。

你可能需要使用 接受 XmlReader 参数重载的方法 (在 3.5 中得到支持)。

编辑:示例代码:

static XDocument LoadFromStream(Stream stream)
{
    using (XmlReader reader = XmlReader.Create(stream))
    {
        return XDocument.Load(reader);    
    }
}

是的,我正在使用3.5框架。它的替代方案应该是什么? - Nick Kahn
请问您能否给我展示一些使用xmlReader的Stream的样例代码? - Nick Kahn
@teki:编辑后提供了一种你可以使用的方法。 - Jon Skeet

3

XDocument.Load(Stream)方法是.NET 4中的新功能。对于早期版本的框架,您需要先读取流并将其作为字符串传递:

public static void readXMLOutput(Stream stream){
    string streamContents;
    using(var sr = new StreamReader(stream)){
        streamContents = sr.ReadToEnd();
    }

    var document = XDocument.Parse(streamContents);
}

当我尝试加载streamContents时,出现了错误,错误信息为:“路径中存在非法字符。”我的XML非常简单,没有特殊字符。 - Nick Kahn
1
XDocument.Load 接受文件名而不是 XML 本身。你可以使用 XDocument.Parse 替代 —— 但是这个答案中的代码当前假定为 UTF-8… 使用 XmlReader.Create 更具有鲁棒性,我个人认为。 - Jon Skeet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接