c# - 从文件中读取 xml

标签 c# xml

我在从 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/

相关文章:

c# - SQLite 引用警告处理器不匹配

c++ - 如何将 pugi::char_t* 转换为字符串

php - xpath爆炸整数和比较值

c# WebResponse内容长度限制

java - 我应该添加一个ID吗?

java - 使用 Jackson 将 POJO 序列化为 xml 时删除 xml 包装器

java - JAXB - 编码和解码 Java 子对象

c# - 从 IEnumerable 转换为 IEnumerator

c# - 在 iTextSharp 4.1.6.0 中使用半透明填充绘制形状

c# - 在 azure 函数中查询 Azure 表存储并插入 Dynamics CRM