简体   繁体   English

使用过滤器解析XML文件

[英]Parsing an XML file with a filter

I am trying to figure out how to filter out stuff from an .xml file and take the stuff I want and put it into a DataGridView . 我试图弄清楚如何从.xml文件中过滤掉东西并获取我想要的东西并将其放入DataGridView I can get this working when I make a simple .xml file with <Names><Username>test</Username></Names> . 当我使用<Names><Username>test</Username></Names>创建一个简单的.xml文件时,我可以使用它。

The problem I am having is sorting a more complex XML file. 我遇到的问题是排序更复杂的XML文件。 I have a form page and a button_click action then uses this to send the info to the DataGridView : 我有一个表单页面和一个button_click操作,然后使用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          
}

This is a small portion of the XML file I am trying to filter out 这是我试图过滤掉的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>

In the end I am trying to get the DataGridView to show 2 rows with the info. 最后,我试图让DataGridView显示带有信息的2行。

||Max Turbo Frequency || || Max Turbo Frequency || 4.00|| 4.00 ||

Any info anyone can provide would be great. 任何人都可以提供的任何信息都会很棒。

the xml file seems to be quite complex, also including a different namespaces. xml文件似乎非常复杂,还包括不同的命名空间。

you can try the XPath parsing, this would parse all cells and insert as rows in a datagridview: 您可以尝试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();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM