2017-02-23 88 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解析并过滤掉我不想让我获得我正在寻找的数据。只是想感谢帮助我指引正确道路的人们。 –