簡體   English   中英

XML和C#讀取標題信息

[英]XML and C# Read Header Info

我有一個XML文件,其中包含一些標頭信息,然后是名稱/值對的長列表。 一旦知道節點名稱,就可以讀取名稱/值對了。

這些就像:

<Doubler_Cal>
  <Freq>300000000</Freq> 
  <Mag>14.71725</Mag> 
</Doubler_Cal>
<Doubler_Cal>
  <Freq>310000000</Freq> 
  <Mag>15.25</Mag> 
</Doubler_Cal>
<Doubler_Cal>
  <Freq>320000000</Freq> 
  <Mag>16.25</Mag> 
</Doubler_Cal>
.
.
.
<Tripler_Stuff>
  <Freq>300000000</Freq> 
  <Mag>13.8</Mag> 
</Tripler_Stuff>
<Tripler_Stuff>
  <Freq>310000000</Freq> 
  <Mag>10.15</Mag> 
</Tripler_Stuff>
.
.
.

等等.....

我可以使用這樣的XML文檔閱讀器閱讀它們,

XmlNodeList nodes=doc.DocumentElement.SelectNodes("Doubler_Cal");

要么

XmlNodeList nodes=doc.DocumentElement.SelectNodes("Tripler_stuff");

那里沒問題..... 如果我知道這些節點的名稱 (即“ Doubler_Cal”,“ Tripler_Stuff” ...等)

我遇到的問題是試圖弄清楚如何讀取我擁有的XML文檔中的標頭信息。 標頭中是XML文檔包含的值對名稱的列表。

標頭看起來像這樣(請參見下面的完整代碼段)...

我要在這里解析的節點名稱是

<xs:element name="Doubler_Cal">
<xs:element name="Tripler_Stuff">
<xs:element name="This_too_is_possible">
<xs:element name="YetAnotherName">

產生包含以下內容的字符串數組:“ Doubler_Cal”,“ Tripler_Stuff”,“ This_too_is_possible”,“ YetAnotherName”。

一旦知道了這些,就可以使用我的“一個有效的”代碼行來獲取該特定名稱的所有值對。

這是更完整的XML文件的帖子-它不包含所有值對,因為其中有100個。 但是應該足以弄清楚發生了什么。

<NewDataSet>
  <xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
    <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
      <xs:complexType>
        <xs:choice minOccurs="0" maxOccurs="unbounded">
          <xs:element name="Doubler_Cal">
            <xs:complexType>
              <xs:sequence>
                <xs:element name="Freq" type="xs:double" />
                <xs:element name="Mag" type="xs:double" minOccurs="0" />
              </xs:sequence>
            </xs:complexType>
          </xs:element>
          <xs:element name="Tripler_Stuff">
            <xs:complexType>
              <xs:sequence>
                <xs:element name="Freq" type="xs:double" />
                <xs:element name="Mag" type="xs:double" minOccurs="0" />
              </xs:sequence>
            </xs:complexType>
          </xs:element>
          <xs:element name="This_too_is_possible">
            <xs:complexType>
              <xs:sequence>
                <xs:element name="Freq" type="xs:double" />
                <xs:element name="Mag" type="xs:double" minOccurs="0" />
              </xs:sequence>
            </xs:complexType>
          </xs:element>
          <xs:element name="YetAnotherName">
            <xs:complexType>
              <xs:sequence>
                <xs:element name="Freq" type="xs:double" />
                <xs:element name="Mag" type="xs:double" minOccurs="0" />
              </xs:sequence>
            </xs:complexType>
          </xs:element>
        </xs:choice>
      </xs:complexType>
    </xs:element>
  </xs:schema>
  <Doubler_Cal>
    <Freq>300000000</Freq>
    <Mag>14.71725</Mag>
  </Doubler_Cal>
  <Doubler_Cal>
    <Freq>310000000</Freq>
    <Mag>15.25</Mag>
  </Doubler_Cal>
  <Doubler_Cal>
    <Freq>320000000</Freq>
    <Mag>16.25</Mag>
  </Doubler_Cal>
  <Tripler_Stuff>
    <Freq>300000000</Freq>
    <Mag>13.8</Mag>
  </Tripler_Stuff>
  <Tripler_Stuff>
    <Freq>310000000</Freq>
    <Mag>10.15</Mag>
  </Tripler_Stuff>
  <This_too_is_possible>
    <Freq>322000000</Freq>
    <Mag>17.25</Mag>
  </This_too_is_possible>
  <This_too_is_possible>
    <Freq>332000000</Freq>
    <Mag>18.8</Mag>
  </This_too_is_possible>
  <This_too_is_possible>
    <Freq>334000000</Freq>
    <Mag>19.15</Mag>
  </This_too_is_possible>
  <YetAnotherName>
    <Freq>322000000</Freq>
    <Mag>17.25</Mag>
  </YetAnotherName>
  <YetAnotherName>
    <Freq>332000000</Freq>
    <Mag>18.8</Mag>
  </YetAnotherName>
</NewDataSet>

感謝您的幫助,我非常感激。

基於上下文,您似乎正在使用XML文件DataSet.WriteXml(string, XmlWriteMode.WriteSchema)通過DataSet.WriteXml(string, XmlWriteMode.WriteSchema)保存DataSet.WriteXml(string, XmlWriteMode.WriteSchema) 您應該使用 DataSet.ReadXml 讀取此文件 每個值對都是表中的行。

例:

var rhDs = new DataSet();
rhDs.ReadXml("dat.xml");

foreach (DataTable table in rhDs.Tables)
{
    Console.WriteLine("Table: {0}\r\n", table.TableName);

    foreach (DataColumn column in table.Columns)
    {
        Console.Write("{0}\t", column.ColumnName);
    }
    Console.WriteLine("\r\n-----------------------------------------");

    foreach (DataRow row in table.Rows)
    {
        foreach (DataColumn column in table.Columns)
        {
            Console.Write("{0}\t", row[column]);
        }
        Console.WriteLine();
    }

    Console.WriteLine();
    Console.WriteLine();
}

印刷品:

Table: Doubler_Cal
Freq    Mag
-----------------------------------------
300000000       14.71725
310000000       15.25
320000000       16.25


Table: Tripler_Stuff
Freq    Mag
-----------------------------------------
300000000       13.8
310000000       10.15


Table: This_too_is_possible
Freq    Mag
-----------------------------------------
322000000       17.25
332000000       18.8
334000000       19.15


Table: YetAnotherName
Freq    Mag
-----------------------------------------
322000000       17.25
332000000       18.8


手動解析

如果您不使用保存的數據集,則您提供的信息看起來像嵌入式XML模式,但是格式不正確。 因此,通過模式解析器解析它會遇到一些問題。 您將必須引用文件中其他地方必須存在的名稱空間。

印刷品:

Doubler_Cal
Tripler_Stuff
This_too_is_possible
YetAnotherName

您也可以通過以下方式使用XmlDocument進行此操作:

var xd = new XmlDocument();
xd.Load("XMLFile1.xml");

var names = new XmlNamespaceManager(xd.NameTable);
names.AddNamespace("xs", "http://www.w3.org/2001/XMLSchema");
var elementNames = xd.SelectNodes("/NewDataSet/xs:schema/xs:element/xs:complexType/xs:choice/xs:element/@name", names);

foreach (XmlAttribute name in elementNames)
{
    Console.WriteLine(name.Value);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM