gpt4 book ai didi

c# - Linq 查询后从 Xdocument 获取文件名

转载 作者:太空宇宙 更新时间:2023-11-03 13:46:55 25 4
gpt4 key购买 nike

我在一堆 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);

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

最佳答案

您可以指定必须在加载时设置文档的基本 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

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

假设我将 MemoryStreamNetworkStream 传递给 XDocument.Load(),然后没有文件名。通常,在使用流或阅读器时,您没有文件名。

但是有一个异常(exception):如果您可以获取读取器的基本流并将其转换为 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 */ }

// ...
}

关于c# - Linq 查询后从 Xdocument 获取文件名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15003201/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com