我正在查询一堆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);正如我所说的,我需要以某种方式标识查询从中查找匹配的文件。有什么想法吗?
发布于 2013-02-21 13:21:10
可以指定必须在加载时设置文档的基本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如果使用的是Stream或TextReader,则必须从其他地方获取文件名并自己存储。否则,就无法获得文件名。
假设我将一个MemoryStream或NetworkStream传递给XDocument.Load(),那么就没有文件名了。通常,在处理流或读取器时,您没有文件名。
但是,有一个例外:如果可以获取读取器的基本流并将其转换为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 */ }
// ...
}https://stackoverflow.com/questions/15003201
复制相似问题