gpt4 book ai didi

c# - 从文件中读取 xml

转载 作者:数据小太阳 更新时间:2023-10-29 01:57:56 26 4
gpt4 key购买 nike

我在从 xml 文件中读取信息时遇到了一点问题...

传给我的文件有几千行。我只对其中的 300 - 400 行感兴趣。当用户完成他的操作并且要读取的数据可以存储在 List<string> 中时,我不需要将任何数据写回 xml。 .

我使用 XmlTextReader 在网上找到了解决方案读取数据。所以我不必创建一个类并使用序列化程序。但似乎我正在使用 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>

我只对 Value 感兴趣最内部的名称元素(前两个是“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;
}
}

但是条件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);
}
}

因为你的xml中有很多ProjectList这样的节点,所以我这里使用了SelectMany,并且添加了root元素来测试一下,最后的输出是

098-0031
098-0032
W098-32
098-0001
098-0011

关于c# - 从文件中读取 xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31399574/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com