XML和C#读取标题信息

时间:2015-07-26 15:23:07

标签: c# .net xml

我有一个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");

没问题..... 如果我知道这些节点的名称(即&#34; Doubler_Cal&#34;,&#34; Tripler_Stuff&#34; ......等等)

我遇到的问题是试图找出如何阅读我所拥有的XML文档中的标题信息。在标题中是XML文档包含的值对名称列表。

标题如下所示(请参阅下面的完整代码段)...

我试图解析的节点名称是

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

生成一个包含以下内容的字符串数组: &#34; Doubler_Cal&#34 ;, &#34; Tripler_Stuff&#34 ;, &#34; This_too_is_possible&#34 ;, &#34; YetAnotherName&#34;

一旦我知道这些,我可以使用我的&#34;一个工作&#34;获取该特定名称的所有值对的代码行。

这是一个更完整的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>

感谢您的帮助,我很感激。

1 个答案:

答案 0 :(得分:3)

基于上下文,您似乎正在处理使用DataSet.WriteXml(string, XmlWriteMode.WriteSchema)保存的XML文件。 您应该使用 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);
}