2013-02-21 27 views
2

我在查詢一堆SGML文檔中的特定元素和屬性。這工作正常,當它找到包含指定項目的文件時將顯示一個消息框。然而,我需要它做的也是給我它的文件名,否則它是無用的。我似乎無法找到獲取文件的文件名的方法。我有:Linq查詢後從Xdocument獲取文件名

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

正如我所說,我需要以某種方式識別查詢找到匹配的文件。有任何想法嗎?

+1

什麼類型都有sgmlReader?爲什麼你不能使用加載到XDocument的文件的名稱? – 2013-02-21 13:29:11

回答

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 

如果您正在使用一個StreamTextReader,你必須從其他地方獲得文件名並自己存儲。否則無法獲取文件名。

想象一下,我通過了MemoryStreamNetworkStreamXDocument.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 */ } 

    // ... 
} 
+1

看起來像BaseUri不能將流傳遞給文檔(如有問題) – 2013-02-21 13:25:22