C# 用C语言读取XML数据
我一直在尝试如何用XML创建数据库。我已经成功地编写了数据,如下所示:C# 用C语言读取XML数据,c#,xml,C#,Xml,我一直在尝试如何用XML创建数据库。我已经成功地编写了数据,如下所示: <Employees> <Worker> <ID>1</ID> <FirstName>Ilan</FirstName> <LastName>Berlinbluv</LastName> <Salary>5000</Salary>
<Employees>
<Worker>
<ID>1</ID>
<FirstName>Ilan</FirstName>
<LastName>Berlinbluv</LastName>
<Salary>5000</Salary>
</Worker>
</Employees>
我一直在做这些工作,但是没有用。不要试图编写代码来读取XML文档。改用内置的XML序列化程序 您可以使用来使用序列化程序。首先创建一个XML模式,然后从XML模式创建一个类。然后可以将XML直接读取到对象:
/// <summary>
///
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="xml"></param>
/// <exception cref="InvalidOperationException"></exception>
/// <returns></returns>
public static T Deserialize<T>(XmlNode xml)
{
// Assuming xml is an XML document containing a serialized object.
XmlNodeReader reader = new XmlNodeReader(xml);
// When we get the xml, it is usually a sub element that can have a different name, than the type name. Therefore look for the name
XmlSerializer ser = new XmlSerializer(typeof(T));
object obj = ser.Deserialize(reader);
// Then you just need to cast obj into whatever type it is eg:
return (T)obj;
}
/// <summary>
/// Serializes without removing namespace and using the specified encoding
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="obj"></param>
/// <param name="encoding"></param>
/// <returns></returns>
/// <exception cref="InvalidOperationException">When the object can not be serialized to xml</exception>
public static XmlDocument Serialize<T>(T obj, Encoding encoding)
{
XmlSerializer ser = GetSerializer(obj.GetType());
using (MemoryStream stream = new MemoryStream())
using (XmlTextWriter writer = new XmlTextWriter(stream, encoding))
{
ser.Serialize(writer, obj);
XmlDocument doc = new XmlDocument();
writer.Flush();
stream.Position = 0;
doc.Load(stream);
return doc;
}
}
您可能希望在创建类之前编辑XML模式,以确保类型正确。获取对XML文件特定节点的访问的最简单方法是使用LINQ
string writePath = Environment.ExpandEnvironmentVariables("%USERPROFILE%") + @"\Desktop";
string writeFile = writePath + @"\Employees.xml";
XDocument xmlDocument = XDocument.Load(writeFile)
然后,如果要读取Worker元素中的所有元素
var queryResult = from x in xmlDocument.Root.Element("Worker").Elements() select x;
foreach (var item in queryResult)
{
Console.WriteLine(item.Value);
}
或者,如果希望单独处理所有辅助元素,只需将查询结果强制转换为列表
var queryResult = (from x in xmlDocument.Root.Element("Worker").Elements() select x).ToList();
Console.WriteLine("Start reading <ID> element");
Console.WriteLine("Contains: " + queryResult[0]);
Console.WriteLine("Start reading <FirstName> element");
Console.WriteLine("Contains: " + queryResult[1]);
Console.WriteLine("Start reading <LastName> element");
Console.WriteLine("Contains: " + queryResult[2]);
Console.WriteLine("Start reading <Salary> element");
Console.WriteLine("Contains: " + queryResult[3]);
我发现,在序列化业务对象时,使用XML总是更容易 [可序列化] 公营雇员 { 私人名单(劳工),; [XmlArray] 公开名单工人 { 获取{return\u Workers;} 设置{u Workers=value;} } } [可序列化] 公社工人 { 公共Int32 ID{get;set;} 公共字符串名{get;set;} //等等。 public void序列化ToxmlString outputFolderLocation { 尝试 { if!outputFolderLocation.EndsWith'\\' { outputFolderLocation+=\\; } //为输出创建我们自己的名称空间 XmlSerializerNamespaces ns=新的XmlSerializerNamespaces; //添加空命名空间和空值 ns.加上; XmlSerializer serializer=新的XmlSerializertypeofWorker; 字符串outpath=outputFolderLocation+FileName-+DateTime.Now.ToBinary.ToString+.xml; XmlTextWriter textWriter=新的XmlTextWriteroutpath,Encoding.GetEncodingISO-8859-1; serializer.SerializetextWriter,this,ns; textWriter.Close; } 捕获异常 { 抛出新的ExceptionError序列化为XML,例如; } } } 您还可以通过使值成为XML属性而不是节点来整理XML。要执行此操作,请将属性更改为:
[XmlAttribute("ID-Value")]
public Int32 ID { get; set; }
// would serialise like this <worker ID-Value="1"></worker>
您需要使用read.InnerText而不是read.Value
一旦您了解了所有这些是如何工作的,我建议您使用内置的XML处理函数。您将省去很多麻烦。您不能使用LINQ to xml吗?请参阅–如果IsStartElement为true,则读取器所在的xml元素节点没有值。如果您不需要流式方法的性能,那么使用I think.LINQ to XML或其他DOM风格的API来获取元素中的文本也是一个不错的建议。是的,但我有更多的价值观:1伊兰·柏林布鲁夫5000 2诺姆·英巴4000 3盖·霍维茨3500 4伊兰·科恩2000你可以做的:XElement employees=XElement.Loadfilename.xml;country.ElementsWorker.ElementsSalary{Response.Writename.Value;}
var queryResult = from x in xmlDocument.Root.Element("Worker").Elements() select x;
foreach (var item in queryResult)
{
Console.WriteLine(item.Value);
}
var queryResult = (from x in xmlDocument.Root.Element("Worker").Elements() select x).ToList();
Console.WriteLine("Start reading <ID> element");
Console.WriteLine("Contains: " + queryResult[0]);
Console.WriteLine("Start reading <FirstName> element");
Console.WriteLine("Contains: " + queryResult[1]);
Console.WriteLine("Start reading <LastName> element");
Console.WriteLine("Contains: " + queryResult[2]);
Console.WriteLine("Start reading <Salary> element");
Console.WriteLine("Contains: " + queryResult[3]);
[XmlAttribute("ID-Value")]
public Int32 ID { get; set; }
// would serialise like this <worker ID-Value="1"></worker>