我想从xml文件中获取所有元素名称,例如xml文件是,
<BookStore>
<BookStoreInfo>
<Address />
<Tel />
<Fax />
<BookStoreInfo>
<Book>
<BookName />
<ISBN />
<PublishDate />
</Book>
<Book>
....
</Book>
</BookStore>
Run Code Online (Sandbox Code Playgroud)
我想得到元素的名称"BookName"."ISBN"和"PublishDate"只有那些名称,不包括"BookStoreInfo"及其子节点的名称
我尝试了几种方法,但是不起作用,我该怎么办呢?
Mar*_*ell 32
好吧,使用XDocument和LINQ-to-XML:
foreach(var name in doc.Root.DescendantNodes().OfType<XElement>()
.Select(x => x.Name).Distinct())
{
Console.WriteLine(name);
}
Run Code Online (Sandbox Code Playgroud)
但是,有很多类似的路线.
使用XPath
XmlDocument xdoc = new XmlDocument();
xdoc.Load(something);
XmlNodeList list = xdoc.SelectNodes("//BookStore");
Run Code Online (Sandbox Code Playgroud)
为您提供一个列表,其中包含名为BookStore的文档中的所有节点
我同意Adam,理想的条件是拥有一个定义xml文档内容的模式.但是,有时这是不可能的.这是一个简单的方法,用于迭代xml文档的所有节点,并使用字典存储唯一的本地名称.我喜欢跟踪每个本地名称的深度,所以我使用int列表来存储深度.请注意,XmlReader"很容易在内存中",因为它不像XmlDocument那样加载整个文档.在某些情况下,它没有什么区别,因为xml数据的大小很小.在以下示例中,使用XmlReader读取18.5MB文件.使用XmlDocument加载此数据的效率低于使用XmlReader读取和采样其内容的效果.
string documentPath = @"C:\Docs\cim_schema_2.18.1-Final-XMLAll\all_classes.xml";
Dictionary<string, List<int>> nodeTable = new Dictionary<string, List<int>>();
using (XmlReader reader = XmlReader.Create(documentPath))
{
while (!reader.EOF)
{
if (reader.NodeType == XmlNodeType.Element)
{
if (!nodeTable.ContainsKey(reader.LocalName))
{
nodeTable.Add(reader.LocalName, new List<int>(new int[] { reader.Depth }));
}
else if (!nodeTable[reader.LocalName].Contains(reader.Depth))
{
nodeTable[reader.LocalName].Add(reader.Depth);
}
}
reader.Read();
}
}
Console.WriteLine("The node table has {0} items.",nodeTable.Count);
foreach (KeyValuePair<string, List<int>> kv in nodeTable)
{
Console.WriteLine("{0} [{1}]",kv.Key, kv.Value.Count);
for (int i = 0; i < kv.Value.Count; i++)
{
if (i < kv.Value.Count-1)
{
Console.Write("{0}, ", kv.Value[i]);
}
else
{
Console.WriteLine(kv.Value[i]);
}
}
}
Run Code Online (Sandbox Code Playgroud)