【问题标题】:I can't read the values in xml file with c#我无法使用 c# 读取 xml 文件中的值
【发布时间】:2019-07-25 00:49:24
【问题描述】:

我有一个xml文件,结构如下,无法读取文本前的“Var_”值,Var_A ecc... 我做错了什么?

<VarList>
<VarProject Var_A="1" Var_B="1" Var_C="" Var_D="" VarE="">text_text_text</VarProject>
</VarList>

这是我的代码:

using System;
using System.Xml;

namespace ReadXMLfromFile
{
    class Class1
    {
        static void Main(string[] args)
        {
            XmlTextReader reader = new XmlTextReader("file.xml");
            while (reader.Read())
            {
                switch (reader.NodeType)
                {
                    case XmlNodeType.Element:
                        Console.Write("<" + reader.Name);
                        Console.WriteLine(">");
                        break;
                    case XmlNodeType.Text:
                        Console.WriteLine(reader.Value);
                        break;
                    case XmlNodeType.EndElement:
                        Console.Write("</" + reader.Name);
                        Console.WriteLine(">");
                        break;
                }
            }
            Console.ReadLine();
        }
    }
}

【问题讨论】:

  • 我不确定你想做什么。你的输出是什么,你期望什么输出?
  • 对不起,我是 Stack Overflow 的新手,我的英语说得不太好。我是 C# 和 XML 文件的新手,我不知道它们被称为属性。非常感谢您的解决方案。

标签: c# xml


【解决方案1】:

我想,你错过了阅读属性。 您可以按照here 描述的方式进行操作:

    XmlTextReader reader = new XmlTextReader("file.xml");
    while (reader.Read())
    {
        reader.NodeType.Dump();
        switch (reader.NodeType)
        {
            case XmlNodeType.Element:
                Console.Write("<" + reader.Name);
                Console.WriteLine(">");
                  while (reader.MoveToNextAttribute()) {
                    Console.WriteLine(" {0}={1}", reader.Name, reader.Value);
                  } 
                  break;
            case XmlNodeType.Text:
                Console.WriteLine(reader.Value);
                break;
            case XmlNodeType.EndElement:
                Console.Write("</" + reader.Name);
                Console.WriteLine(">");
                break;
        }
    }

【讨论】:

    【解决方案2】:

    您正在阅读仅节点元素部分而不是 childNodes 要读取子节点,您可以使用此代码

            XmlTextReader reader = new XmlTextReader(@"youfilePath");
            XmlDocument doc = new XmlDocument();
            XmlNode node = doc.ReadNode(reader);
            foreach (XmlNode item in node.ChildNodes)
            {
                // node stuff...
                if (item.Attributes != null)
                {
                    foreach (XmlAttribute att in item.Attributes)
                    {
                        // attribute stuff
                    }
                }
            }
    

    所以要这样做

     while (reader.Read())
            {
    
    
                switch (reader.NodeType)
                { 
                    case XmlNodeType.Element:
                        Console.Write(" < " + reader.Name);
                        Console.WriteLine(">");
                        if (reader.HasAttributes)
                        {
                            while (reader.MoveToNextAttribute())
                            {
                                Console.WriteLine(" {0}={1}", reader.Name, reader.Value);
                            }
                        }
                        break;
                    case XmlNodeType.Text:
                        Console.WriteLine(reader.Value);
                        break;
    
                    case XmlNodeType.EndElement:
                        Console.Write("</" + reader.Name);
                        Console.WriteLine(">");
                        break;
                }
            }
    

    结果应该是:

    【讨论】:

    • 鉴于子 元素(也是节点)被读取,您的初始描述令人困惑。如果您只是说 OP 没有使用阅读器中的属性,那就更清楚了。鉴于 OP 未使用 XmlDocument,因此尚不清楚第一段代码的含义。 (如果你只是想证明存在属性,我会使用 XDocument 作为更干净、更现代的 API。)
    • 对不起,我是 Stack Overflow 的新手,我的英语说得不太好。我是 C# 和 XML 文件的新手,我不知道它们被称为属性。我使用了一个取自 Microsoft 网站的示例,我无法理解为什么没有显示所有数据。非常感谢您的解决方案。
    【解决方案3】:

    您可以使用LINQ XDocument

     XDocument xml = XDocument.Load("file.xml");
    
                foreach(XElement element in xml.Descendants())
                {
                    // in this example there is only one xElement but that element contains all of our attributes
                    // we could also display the element value here (example: text_text_text)
                    IEnumerable<XAttribute> attributes = element.Attributes();
    
                    foreach(XAttribute attribute in attributes)
                    {
                        // display the attribute name (example: "var_A")
                        Console.WriteLine(attribute.Name);
                        // display the attribute value (example: "1")
                        Console.WriteLine(attribute.Value);
                    }
                }
    

    【讨论】:

    • 我会或你应该!? ;)
    猜你喜欢
    • 1970-01-01
    • 2021-02-14
    • 2011-11-29
    • 1970-01-01
    • 1970-01-01
    • 2020-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多