2017-02-23 89 views
1

我想弄清楚如何從.xml文件中過濾掉東西,並將所需的東西放入DataGridView。當我用<Names><Username>test</Username></Names>製作一個簡單的.xml文件時,我可以得到這個工作。用過濾器解析XML文件

我遇到的問題是排序一個更復雜的XML文件。我有一個表單頁面,然後button_click操作使用此發送信息到DataGridView

private void button1_Click(object sender, EventArgs e) 
{   
    DataSet dsload = new DataSet(); 
    dsload.ReadXml("C:\\Users\\VSBox\\Desktop\\test1.xml"); 
    dgvParseProc.DataSource = dsload.Tables[0]; 
    //dgvParseProc.DataMember = "<ss:Row>"; //failed test filter   
} 

這是XML文件的一小部分,我試圖篩選出

<?xml version="1.0"?> 
<?mso-application progid="Excel.Sheet"?> 
<ss:Workbook xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns="urn:schemas-microsoft-com:office:spreadsheet"> 
<ss:Styles> 
<ss:Worksheet ss:Name="Sheet1"> 
<ss:Table> 
<Column ss:autofitwidth="1"/> 
<Column ss:autofitwidth="1"/> 
<ss:Row ss:StyleID="1"> 
<ss:Cell ss:MergeAcross="2"> 
<ss:Data ss:Type="String"> ARK | Compare Intel® Products </ss:Data> 
</ss:Cell> 
</ss:Row> 
    <ss:Row> 
     <ss:Cell ss:StyleID="s22"> 
     <ss:Data ss:Type="String">Max Turbo Frequency</ss:Data> 
     </ss:Cell> 
     <ss:Cell ss:StyleID="s22"> 
     <ss:Data ss:Type="String">4.00 GHz</ss:Data> 
     </ss:Cell> 
    </ss:Row> 

在我試圖讓DataGridView顯示2行的信息。

||最大Turbo頻率|| 4.00 ||

任何人都可以提供的信息會很好。

+0

啊謝謝我仍然得到使用,以發佈代碼。當我複製了xml代碼時,破折號必須形成,我認爲這只是爲了最小化行塊。 –

+0

你能不能請複製第一行,否則xml文件是不可解析的,因爲缺少名稱空間聲明 – user287107

+0

對不起,這裏是最上面的部分。 –

回答

0

這個xml文件好像很複雜,還包括不同的命名空間。

你可以嘗試的XPath解析,這將解析所有細胞和一個DataGridView插入的行:

 var source = @"<?xml version='1.0' encoding='utf-8'?> 
     <ss:Row> 
      <ss:Cell ss:StyleID='s22'> 
      <ss:Data ss:Type='String'>Max Turbo Frequency</ss:Data> 
      </ss:Cell> 
      <ss:Cell ss:StyleID='s22'> 
      <ss:Data ss:Type='String'>4.00 GHz</ss:Data> 
      </ss:Cell> 
     </ss:Row>";; 

     // load document without namespaces 
     var doc = new XmlDocument(); 
     using (var r = new StringReader(source)) 
     using (var xReader = new XmlTextReader(r)) 
     { 
      xReader.Namespaces = false; 

      doc.Load(xReader); 
     } 
     // select all sub nodes, then all inner nodes, then take the text 
     // create a list with anonymous objects containing the text value 
     dataGridView1.DataSource = 
      doc.SelectNodes("/*/*/*/text()").OfType<XmlNode>().Select(n => new { Value = n.Value }).ToList(); 
+0

好吧我要去閱讀xpath解析,以便我可以更好地瞭解它的功能,並看到我可以讓它工作。謝謝。 –

+0

在做了一些更多的研究之後,我遇到了html敏捷包。在閱讀本文後,我發現這是一個更好的選擇,因爲我可以從網頁本身獲取所需的數據,而不必擔心文件的格式。在頁面上使用html解析並過濾掉我不想讓我獲得我正在尋找的數據。只是想感謝幫助我指引正確道路的人們。 –