加载xml文件并使用c#获取所需的数据

本文关键字:获取 数据 xml 文件 加载 | 更新日期: 2023-09-27 18:25:00

这是我第一次使用xml文件,我不知道自己在做什么。

这是xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<outputTree xmlns="http://www.ibm.com/software/analytics/spss/xml/oms" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.ibm.com/software/analytics/spss/xml/oms http://www.ibm.com/software/analytics/spss/xml/oms/spss-output-1.8.xsd">
  <command command="Summarize" displayOutlineValues="label" displayOutlineVariables="label" displayTableValues="label" displayTableVariables="label" lang="en" text="Summarize">
    <pivotTable subType="Report" text="Batch Processing Report">
      <dimension axis="row" text="Cases">
        <group label="Test Site" text="Test Site" varName="PLANT_DESC" variable="true">
          <group hide="true" text="A">
            <group string="UK" text="Scotland" varName="_DESC">
              <group label="Product" text="Product" varName="PROD_DESC" variable="true">
                <group hide="true" text="A">
                  <group string="NameProduct" text="Name" varName="PROD_DESC">
                    <group label="Batch Number" text="Batch Number" varName="BATCH_NO" variable="true">
                      <group hide="true" text="A">
                        <group number="3692649" text="3692649" varName="BATCH_NO">
                          <category number="1" text="1">
                            <dimension axis="column" text="Variables">
                              <Test ID="1"/>
                              <Test ID="2"/>
                              <category label="Batch Run" text="Batch Run" varName="BATCH_RUN_ID" variable="true">
                                <cell number="4242" text="4242" varName="BATCH_RUN_ID"/>
                              </category>
                              <category label="Application" text="Application" varName="APP_ID" variable="true">
                                <cell label="Calibration" number="101" text="Calibration" varName="APP_ID"/>
                              </category>
                              <category label="Date Tested" text="Date Tested" varName="TEST_DATE" variable="true">
                                <cell date="2014-09-24T10:17:04" format="date" text="24-SEP-2014" varName="TEST_DATE"/>
                              </category>
                            </dimension>
                          </category>
                          <category number="2" text="2">
                            <dimension axis="column" text="Variables">
                              <category label="Batch Run" text="Batch Run" varName="BATCH_RUN_ID" variable="true">
                                <cell number="4256" text="4256" varName="BATCH_RUN_ID"/>
                              </category>
                              <category label="Application" text="Application" varName="APP_ID" variable="true">
                                <cell label="Calibration" number="101" text="Calibration" varName="APP_ID"/>
                              </category>
                              <category label="Date Tested" text="Date Tested" varName="TEST_DATE" variable="true">
                                <cell date="2014-09-24T10:53:12" format="date" text="24-SEP-2014" varName="TEST_DATE"/>
                              </category>
                            </dimension>
                          </category>  
                        </group>
                      </group>
                    </group>
                  </group>
                </group>
              </group>
            </group>
          </group>
        </group>
      </dimension>
    </pivotTable>
  </command>
</outputTree>

我刚刚在xml文件中添加了测试类别<Test ID="1"/>,看看我是否可以获得任何数据,并且它非常完美。

    var doc = XDocument.Load(@"C:'Users'by'Desktop'SITE's.xml");
    XNamespace rss = "http://www.ibm.com/software/analytics/spss/xml/oms";
    foreach (var item in doc.Descendants(rss + "Test"))
    {
        xmlTitle.Text += "</br>" + item.Attribute("ID").Value + " </br>";
    }

我的问题是:

我怎么能把所有东西都放在下面:

<group label="Batch Number" text="Batch Number" varName="BATCH_NO" variable="true">

加载xml文件并使用c#获取所需的数据

假设您希望group元素下的所有元素都具有这些精确的属性/值,那么这样的东西就足够了:

var result = doc.Descendants(rss + "group")
                .Single(e => e.Attribute("label") != null
                          && e.Attribute("label") == "Batch Number"
                          && e.Attribute("text") != null
                          && e.Attribute("text") == "Batch Number"
                          && /* ... */)
                .Descendants();

注意:这假设正好存在一个这样的元素(否则Single()将抛出异常)。

使用以下代码:

        var node = doc.XPathSelectElement("//group[@label='Batch Number']");
        foreach (var item in node.Descendants())
        {
            //sb.Append(item);
        }

我设法解决了我的问题,但花了大约1天的时间。我必须从根到底编写每个元素,并包含名称空间。

private void GetXMLData()
{
    try
    {
        xmlTitle.Text = "";
        XNamespace ns = "http://www.ibm.com/software/analytics/spss/xml/oms";
        XDocument testXML = XDocument.Load(@"C:'Users'by'Desktop'SITE'ori.xml");
        var cats = from cat in testXML.Element(ns + "outputTree")
                       .Elements(ns + "command")
                       .Elements(ns + "pivotTable")
                       .Elements(ns + "dimension")
                       .Elements(ns + "group")
                       .Elements(ns + "group")
                       .Elements(ns + "group")
                       .Elements(ns + "group")
                       .Elements(ns + "group")
                       .Elements(ns + "group")
                       .Elements(ns + "group")
                       .Elements(ns + "group")
                       .Elements(ns + "group")
                       .Elements(ns + "category")
                       select new
                       {
                           parentC = cat.Parent.Attribute("number").Value,
                           id = cat.Attribute("number").Value,                            
                       };
        foreach (var cat in cats)
        {
            xmlTitle.Text += "</br>Parent: " + cat.parentC + " and ";
            xmlTitle.Text += "Cat: " + cat.id + " </br>";
        }

    }
    catch (Exception err)
    {
        throw (err);
    }
}