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

Streamまたはを使用している場合はTextReader、別の場所からファイル名を取得し、自分で保存する必要があります。そうしないと、ファイル名を取得する方法がありません。

MemoryStreamまたはNetworkStreamをに渡したと想像してくださいXDocument.Load()。その場合、ファイル名はありません。一般に、ストリームまたはリーダーを操作する場合、ファイル名はありません。

ただし、例外が 1 つあります。リーダーのベース ストリームを取得して にキャスト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 に答える