当前位置: 首页 > 知识库问答 >
问题:

从文件读取xml

王宏扬
2023-03-14

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

传给我的文件有几千行。我只对300-400行感兴趣。当用户完成操作并且要读取的数据可以存储在列表 中时,我不需要将任何数据写回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>

我只对最内部名称元素的感兴趣(前两个是“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”从来没有填满...谁能给我解释一下为什么。也许可以向我展示一种简单的方法来将这些值存储在列表 中?提前感谢!

编辑:我编辑了XML。很抱歉,但是很难从我的XML中过滤掉那些令人困惑的部分...

共有1个答案

祝俊雄
2023-03-14
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
 类似资料:
  • 问题内容: 我正在使用AJAX从文本文件中读取。我如何只读取第一行? 问题答案: 此代码应帮助您从远程文本文件中读取:

  • 我正在做一个项目,我需要从文件中读取文本,然后将特定部分存储为变量。 假设我有文本文件示例。txt 我想将第一行指定为: 等等 到目前为止,我有这个。 这段代码将打印文件的内容,这是朝着正确方向迈出的一步,但是如何读取每行内容呢? 因为我真的不想养成在内存中存储整个文件的习惯。 我知道你可以用 和类似的方法,但我只是想了解提取值的方法。

  • 问题内容: 有什么办法可以从中读取文件? 我对库或类/代码文件仅在中定义的字符串不感兴趣 问题答案: 是的,您可以使用以下命令提取所有资源文件 脚步 - 要么

  • 问题内容: 我正在尝试使用该模块从python脚本读取json文件。经过一番谷歌搜索后,我发现以下代码: json文件的路径和名称在哪里。我收到以下错误: 问题答案: 该代码用作变量名。它将阴影您导入的模块引用。为变量使用其他名称。 除此之外,代码在接受字符串的同时传递文件对象。 传递文件内容: 或使用接受类似文件的对象。

  • 问题内容: 只是因为一个简单,易于表达的陈述使我的脸上有些错误,所以我有点头疼。 我有一个名为strings.json的json文件,如下所示: 我现在想读取json文件。我发现了以下这些语句,但是不起作用: 控制台上显示的错误是这样的: 已编辑 从更改为 并得到了这个: 问题答案: 该方法(“ load”中没有“ s”)可以直接读取文件: 您正在使用方法,该方法仅用于 字符串 参数。 编辑:新消

  • 我有一个名为Strings.json的json文件,如下所示: 我想读取json文件,现在仅此而已。我发现了这些说法,但它不起作用: 控制台上显示的错误是: 已编辑 从更改为 得到了这个: