首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Linq查询后从Xdocument获取文件名

在Linq查询后从Xdocument获取文件名
EN

Stack Overflow用户
提问于 2013-02-21 13:15:21
回答 1查看 2.4K关注 0票数 2

我正在查询一堆SGML文档,以获得特定的元素和属性。此操作正常,并将在找到包含指定项的文件时显示消息框。但是,我需要它做的是给我找到它们的文件的名称,否则它几乎毫无用处。我似乎找不到办法来获得文件的文件名。我有:

代码语言:javascript
复制
XDocument doc = XDocument.Load(sgmlReader);
IEnumerable<XElement> selectedElement =
    from el in doc.Descendants(Element_textBox.Text)
        where (string)el.Attribute(Attribute_textBox.Text) == Value_textBox.Text
        select el; 
        //need to select the DMC and title and put in a variable, and list them


foreach (XElement elem in selectedElement)
   //Console.WriteLine(elem);

   MessageBox.Show("Data Module Found: " + elem);

正如我所说的,我需要以某种方式标识查询从中查找匹配的文件。有什么想法吗?

EN

回答 1

Stack Overflow用户

发布于 2013-02-21 13:21:10

可以指定必须在加载时设置文档的基本URI:

代码语言:javascript
复制
var doc = XDocument.Load(@"file.xml", LoadOptions.SetBaseUri);

然后可以从任何元素获得文档URI:

代码语言:javascript
复制
var someElement = doc.Root;
var uri = element.Document.BaseUri;
Console.WriteLine(uri);    // Prints: file:///C:/file.xml

如果使用的是StreamTextReader,则必须从其他地方获取文件名并自己存储。否则,就无法获得文件名。

假设我将一个MemoryStreamNetworkStream传递给XDocument.Load(),那么就没有文件名了。通常,在处理流或读取器时,您没有文件名。

但是,有一个例外:如果可以获取读取器的基本流并将其转换为FileStream,则可以获得文件名:

代码语言:javascript
复制
var fs = File.OpenRead(@"C:\myxml.xml");
var reader = new StreamReader(fs);
DoSomething(reader);

static void DoSomething(TextReader reader)
{
    var streamReader = reader as StreamReader;
    if (streamReader != null)
    {
        var fileStream = streamReader.BaseStream as FileStream;
        if (fileStream != null)
            Console.WriteLine(fileStream.Name);
        else { /* No filename */ }
    }
    else { /* No filename */ }

    // ...
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15003201

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档