C# 从文件中读取xml

C# 从文件中读取xml,c#,xml,C#,Xml,我在从xml文件读取信息时遇到了一个小问题 传递给我的文件有数千行。我只对其中的300-400行感兴趣。当用户完成操作后,我不需要将任何数据写回xml,要读取的数据可以存储在列表中 我在网上找到了使用XmlTextReader读取数据的解决方案。因此,我不必创建类并使用序列化程序。但我似乎用错了XmlTextReader。也许你能帮我 这是xml的外观: <?xml version="1.0" encoding="utf-8"?> <ProjectConfiguration x

我在从xml文件读取信息时遇到了一个小问题

传递给我的文件有数千行。我只对其中的300-400行感兴趣。当用户完成操作后,我不需要将任何数据写回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>
但是条件
reader.Name==“Children”
永远不会被填满。。。有人能给我解释一下原因吗。也许能给我一个简单的方法来把这些值存储在
列表中
?提前谢谢

编辑:我编辑了xml。对此很抱歉,但要从我的xml中过滤不必要的混乱部分真的很难…

这有帮助吗?:)

stringpath=@“path.xml”;
if(File.Exists(path)){
XmlTextReader=新的XmlTextReader(路径);
控制台。写线(“”);
while(reader.Read())
{
开关(reader.NodeType)
{
case XmlNodeType.Element:
控制台。写(“”);
打破
案例XmlNodeType.Text:
Console.WriteLine(reader.Value);
打破
案例XmlNodeType.EndElement:
控制台。写(“”);
打破
}
}
Console.ReadLine();
}否则{
Console.WriteLine(“未找到错误文件”);
}

这是什么语言?通过使用标记,您可以像JSON一样遍历XML。

使用
LinqToXml

var xDocument = XDocument.Parse("yourXmlString");
        XNamespace ns = xDocument.Root.GetDefaultNamespace();
        var result = (from e in xDocument
                          .Descendants(ns + "ListNode").Descendants(ns + "Children")
                          .Descendants(ns + "ListNode").Descendants(ns + "Children")
                          .Descendants(ns + "ListNode").Descendants(ns + "Children")
                          .Descendants(ns + "ListNode")
                           select e.Element(ns + "Name").Value).ToList();
私有静态空白填充名(XElement容器,列表结果)
{
XElement[]listNodes=container.Elements(“ListNode”).ToArray();
如果(!listNodes.Any())
返回;
foreach(listNodes中的XElement listNode)
{
XElement nameElement=listNode.Element(“名称”);
if(namelement==null)
继续;
XElement childrenElement=listNode.Element(“子元素”);
if(childrenElement==null)
继续;
if(!childrenElement.HasElements)
结果.Add(namelement.Value);
其他的
填充名(childrenElement、result);
}
}
静态void Main(字符串[]参数)
{
var result=新列表();
string xml=Resources.xml;//TODO:将xml放在这里
XDocument doc=XDocument.Parse(xml);
如果(doc.Root==null)
返回;
XElement[]projects=doc.Root.Elements(“ProjectList”).ToArray();
foreach(项目中的XElement项目)
填充名称(项目、结果);
}

可以使用其他类似
Linq2XML
?@SkyFang绝对可能为您提供很多帮助。为什么第一行抛出XmlException(第1行位置1中的无效数据),而这一行没有:
XmlTextReader=new XmlTextReader(“MyXmlString”)?我的第一行是这样的:
@user3596113在双引号前面使用
\`
作为
如果您想使用硬编码的XML字符串,那么在双引号前面使用反斜杠作为
,否则如果您是从服务器获得的,则无需使用
\`
,谢谢。到目前为止,它还在工作,但结果是空的,这意味着您使用的是问题中给出的相同XML吗?谢谢,但是
eles
对我来说是空的。是的,您应该使用
root.Element(xxx).Element(yyyy.Elements(“ProjectList”)
,因为我不知道您的树结构。您能否以正确的值显示
xmlns
,这非常重要
var xDocument = XDocument.Parse("yourXmlString");
        XNamespace ns = xDocument.Root.GetDefaultNamespace();
        var result = (from e in xDocument
                          .Descendants(ns + "ListNode").Descendants(ns + "Children")
                          .Descendants(ns + "ListNode").Descendants(ns + "Children")
                          .Descendants(ns + "ListNode").Descendants(ns + "Children")
                          .Descendants(ns + "ListNode")
                           select e.Element(ns + "Name").Value).ToList();
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);
    }
}
098-0031
098-0032
W098-32
098-0001
098-0011
private static void FillNames(XElement container, List<string> result)
{
    XElement[] listNodes = container.Elements("ListNode").ToArray();
    if (!listNodes.Any())
        return;

    foreach (XElement listNode in listNodes)
    {
        XElement nameElement = listNode.Element("Name");
        if (nameElement == null)
            continue;

        XElement childrenElement = listNode.Element("Children");
        if (childrenElement == null)
            continue;

        if (!childrenElement.HasElements)
            result.Add(nameElement.Value);
        else
            FillNames(childrenElement, result);
    }
}

static void Main(string[] args)
{
    var result = new List<string>();

    string xml = Resources.Xml; // TODO: put your xml here

    XDocument doc = XDocument.Parse(xml);
    if (doc.Root == null)
        return;

    XElement[] projects = doc.Root.Elements("ProjectList").ToArray();

    foreach (XElement project in projects)
        FillNames(project, result);
}