1

我将它用于我的代码,它完美地输出到 xml 文件,但它在元素名称后添加了一个“=”符号,即使我的元素中只有一个具有属性。

我想我可以做类似的事情

if(reader.Getattribute != "")
// I made that up on the spot, I'm not sure if that would really work
{
      Console.WriteLine("<{0} = {1}>", reader.Name, reader.GetAttribute("name"));
}

else
{
      Console.WriteLine("<{0}>", reader.Name);
}

但是有没有更简洁的编码方式?

我的代码(没有解决方法)

using System;
using System.Xml;
using System.IO;
using System.Text;

public class MainClass
{
    private static void Main()
    {
        XmlWriterSettings settings = new XmlWriterSettings();

        settings.Indent = true;


        XmlWriter w = XmlWriter.Create(@"Path\test.xml", settings);



        w.WriteStartDocument();
        w.WriteStartElement("classes");

        w.WriteStartElement("class");
        w.WriteAttributeString("name", "EE 999");
        w.WriteElementString("Class_Name", "Programming");
        w.WriteElementString("Teacher", "James");
        w.WriteElementString("Room_Number", "333");
        w.WriteElementString("ID", "2324324");
        w.WriteEndElement();




        w.WriteEndDocument();
        w.Flush();
        w.Close();




        XmlReader reader = XmlReader.Create(@"Path\test.xml");

        while (reader.Read())
        {
            switch (reader.NodeType)
            {
                case XmlNodeType.Element:
                    Console.WriteLine("<{0} = {1}>", reader.Name, reader.GetAttribute("name"));
                    break;
                case XmlNodeType.Text:
                    Console.WriteLine(reader.Value);
                    break;
                case XmlNodeType.CDATA:
                    Console.WriteLine("<[CDATA[{0}]>", reader.Value);
                    break;
                case XmlNodeType.ProcessingInstruction:
                    Console.WriteLine("<?{0} {1}?>", reader.Name, reader.Value);
                    break;
                case XmlNodeType.Comment:
                    Console.WriteLine("<!--{0}-->", reader.Value);
                    break;
                case XmlNodeType.XmlDeclaration:
                    Console.WriteLine("<?xml version='1.0'?>");
                    break;
                case XmlNodeType.Document:
                    break;
                case XmlNodeType.DocumentType:
                    Console.WriteLine("<!DOCTYPE {0} [{1}]", reader.Name, reader.Value);
                    break;
                case XmlNodeType.EntityReference:
                    Console.WriteLine(reader.Name);
                    break;
                case XmlNodeType.EndElement:
                    Console.WriteLine("</{0}>", reader.Name);
                    break;
            }
        }
    }
}

输出

<?xml version='1.0'?>
<classes = >
<class = EE 999>
<Class_Name = >
Programming
</Class_Name>
<Teacher = >
James
</Teacher>
<Room_Number = >
333
</Room_Number>
<ID = >
2324324
</ID>
</class>
</classes>
4

2 回答 2

1

因为这条线

case XmlNodeType.Element:
       Console.WriteLine("<{0} = {1}>", reader.Name, reader.GetAttribute("name"));
       break;

总是写'='而不检查。

粗略的修复:

case XmlNodeType.Element:
       Console.WriteLine("<{0}", reader.Name);
       if (reader.HasAttributes)
          // Write out attributes
       Console.WriteLine(">");
       break;

但是你为什么要使用 XmlReader 呢?它很麻烦,只有在处理巨大的 Xml 流时才有用。

如果您的数据集不是 >> 10 MB,请查看 XDocument 或 XmlDocument

您的示例中的 XmlWriter 可以替换为(粗略):

 // using System.Xml.Linq;

        var root = new XElement("classes",
            new XElement("class", new XAttribute("name", "EE 999"),
                new XElement("Class_Name", "Programming"),
                new XElement("Teacher", "James")
                ));

        root.Save(@"Path\test.xml");

     var doc = XDocument.Load(@"Path\test.xml");
     // doc is now an in-memory tree of XElement objects 
     // that you can navigate and query

这是一个介绍

于 2010-08-04T18:36:41.820 回答
0

我不确切知道您要完成什么,但我个人会创建一个 .NET 类来表示您的类元素,其属性标识子元素,然后使用 System.Xml.Serialization.XmlSerializer 从文件中写入或读取它。

这是一个例子:

using System.Xml.Serialization;

public class MyClasses : List<MyClass>{}    

public class MyClass{
 public String Teacher{ get; set; }
}

void main(){
  MyClasses classList = new MyClasses();

  MyClass c = new MyClass();
  c.Teacher = "James";

  classList.Add(c);

  XmlSerializer serializer = new XmlSerializer(classList.GetType());
  serializer.Serialize(/*Put your stream here*/);
}

而且,在将设置流作为练习留给读者 blamo 之后,您已经完成了将对象的 XML 表示形式输出到某个流。流可以是文件、字符串等。对不起,讨厌的 C#(如果它讨厌的话)我每天都使用 VB.NET,所以语法和关键字可能有点不对劲。

更新
我添加了一些代码来展示如何序列化类的集合。如果节点没有正确命名,则可以将属性添加到类属性中,只需快速搜索一下即可。

再次更新
对不起,当我们使用同一个词来表示两种不同的事物时,很难解释。假设您正在尝试代表一桶砖。您将编写一个名为Brick的 C# 类,而从您Bucket继承的名为的 C# 类将具有一个名为. 然后,您将用不同的颜色制作所有砖块,并用砖块填满桶。然后你会将你的存储桶传递给序列化程序,它会给你类似的东西:List<Brick>BrickColor

<Bucket>    
  <Brick>  
    <Color>    
      blue     
    </Color>  
  </Brick>   
</Bucket> 

序列化程序根据类的定义为您构建 XML,因此您不必担心细节。您可以在此处此处阅读有关它的更多信息

于 2010-08-04T18:46:09.597 回答