我正在将它用于我的代码,它完美地输出到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>
答案 0 :(得分: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流时才有用。
如果您的数据集不是&gt;&gt; 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
这是an intro
答案 1 :(得分:0)
我不确切地知道你要完成什么,但我个人会创建一个.NET类来表示你的class元素,其中包含标识子元素的属性,然后使用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,所以语法和关键字可能有点偏差。
<强>更新强>
我添加了一些代码来展示如何序列化类的集合。如果节点未正确命名,则可以添加到类属性中的属性,只需为它们快速google。
再次更新
对不起,当我们使用同一个词来表示两个不同的东西时很难解释。让我们说你试图代表一桶砖。您将编写一个名为Brick
的C#类和一个名为Bucket
的C#类,它继承自List<Brick>
,Brick
将拥有一个名为Color
的属性。然后,您将使用不同颜色制作所有砖块,并用砖块填充桶。然后你会把你的桶传递给序列化器,它会给你类似的东西:
<Bucket>
<Brick>
<Color>
blue
</Color>
</Brick>
</Bucket>