从xml文件中读取信息时出了点问题...
传递给我的文件有数千行.我只对300到400行感兴趣.当用户完成其操作并且要读取的数据可以存储在a中时,我不需要将任何数据写回xml List<string>.
我在网上找到了使用a XmlTextReader来读取数据的解决方案.所以我不必创建一个类并使用Serializer.但似乎我使用了XmlTextReader错误.也许你可以帮助我......
这就是xml的样子:
<?xml version="1.0" encoding="utf-8"?>
<ProjectConfiguration xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsi="http://www.w3.org/2001/XMLSchema-instance">
<ProjectLists xmlns="...">
<ProjectList>
... // not interested in this data
</ProjectList>
<ProjectList>
<ListNode>
<Name>Test_Environment</Name>
<Children>
<ListNode>
<Name>yyy</Name>
<Children>
<ListNode>
<Name>205 (ST)</Name>
<Children>
<ListNode>
<Name>098-0031</Name>
<Children />
</ListNode>
<ListNode>
<Name>098-0032</Name>
<Children />
</ListNode>
//more ListNodes...
</Children>
</ListNode>
<ListNode>
<Name>old</Name>
<Children>
<ListNode>
<Name>W098-32</Name>
<Children />
</ListNode>
</Children>
</ListNode>
</Children>
</ListNode>
<ListNode>
<Name>xxx</Name>
<Children />
</ListNode>
<ListNode>
<Name>098-0001</Name>
<Children />
</ListNode>
<ListNode>
<Name>098-0011</Name>
<Children />
</ListNode>
// More List Nodes
</Children>
</ListNode>
<ListNode>
// more List Nodes
</ListNode>
</ProjectList>
<ProjectList>
//more uninteresting ProjectLists...
</ProjectList>
Run Code Online (Sandbox Code Playgroud)
我只对Value最内在的Name Elements 感兴趣(前两个是"098-0031"和"098-0032").
这是我的代码:
while (reader.Read()) {
switch (reader.NodeType) {
case XmlNodeType.Element:
{
if (reader.Name == "Name") {
reader.Read();
if (reader.Value == "Test_Environment") {
reader.ReadToDescendant("Children");
if (reader.Name == "Children") {
reader.ReadToDescendant("Children");
}
}
}
}
break;
}
}
Run Code Online (Sandbox Code Playgroud)
但条件reader.Name == "Children"永远不会满满的......有人可以向我解释原因.也许告诉我一个简单的方法来存储这些值List<string>?提前致谢!
编辑:我编辑了xml.对不起,但很难从我的xml中过滤掉不必要的混乱部分......
static void GetMostInnerName()
{
string xml = @"<ProjectConfiguration xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xsi=""http://www.w3.org/2001/XMLSchema-instance"">
<ProjectLists>
<ProjectList>
<ListNode>
<Name>Test_Environment</Name>
<Children>
<ListNode>
<Name>yyy</Name>
<Children>
<ListNode>
<Name>205 (ST)</Name>
<Children>
<ListNode>
<Name>098-0031</Name>
<Children />
</ListNode>
<ListNode>
<Name>098-0032</Name>
<Children />
</ListNode>
</Children>
</ListNode>
<ListNode>
<Name>old</Name>
<Children>
<ListNode>
<Name>W098-32</Name>
<Children />
</ListNode>
</Children>
</ListNode>
</Children>
</ListNode>
<ListNode>
<Name>xxx</Name>
<Children>
<ListNode>
<Name>098-0001</Name>
<Children />
</ListNode>
<ListNode>
<Name>098-0011</Name>
<Children />
</ListNode>
</Children>
</ListNode>
// more List Nodes
</Children>
</ListNode>
</ProjectList></ProjectLists>
</ProjectConfiguration>";
XElement root = XElement.Parse(xml).Element("ProjectLists");
//var xmlns = root.GetDefaultNamespace();
//Console.WriteLine(xmlns);
var eles = root.Elements("ProjectList").SelectMany(x => x.Elements("ListNode"));
List<string> list = new List<string>();
foreach (var ele in eles)
{
Loop(ele, list);
}
list.ForEach(x =>
{
Console.WriteLine(x);
});
}
static void Loop(XElement ele, List<string> list)
{
var child = ele.Element("Children");
if (child != null && child.HasElements)
{
foreach (var e in child.Elements("ListNode"))
{
Loop(e, list);
}
}
else
{
list.Add(ele.Element("Name").Value);
}
}
Run Code Online (Sandbox Code Playgroud)
因为你的xml有很多像这样的节点ProjectList,所以我在这里使用SelectMany,并且我添加root元素进行测试,最后的输出是
098-0031
098-0032
W098-32
098-0001
098-0011
Run Code Online (Sandbox Code Playgroud)