我有一个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>
感谢您的帮助,我很感激。
答案 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);
}