2

我正在查询一堆 SGML 文档以获取特定的元素和属性。这工作正常,当它找到包含指定项目的文件时会显示一个消息框。但是,我需要它做的也是给我找到它们的文件的名称,否则它几乎没用。我似乎找不到获取文件文件名的方法。我有:

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);

正如我所说,我需要以某种方式识别查询从中找到匹配项的文件。有任何想法吗?

4

1 回答 1

1

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

var doc = XDocument.Load(@"file.xml", LoadOptions.SetBaseUri);

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

var someElement = doc.Root;
var uri = element.Document.BaseUri;
Console.WriteLine(uri);    // Prints: file:///C:/file.xml

如果您使用Streamor TextReader,则必须从其他地方获取文件名并自己存储。否则无法获取文件名。

想象一下我传递了一个MemoryStreamor NetworkStreamto XDocument.Load(),那么就没有文件名了。通常,在使用流或阅读器时,您没有文件名。

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

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 */ }

    // ...
}
于 2013-02-21T13:21:10.010 回答