C# 用C语言读取XML数据

C# 用C语言读取XML数据,c#,xml,C#,Xml,我一直在尝试如何用XML创建数据库。我已经成功地编写了数据,如下所示: <Employees> <Worker> <ID>1</ID> <FirstName>Ilan</FirstName> <LastName>Berlinbluv</LastName> <Salary>5000</Salary>

我一直在尝试如何用XML创建数据库。我已经成功地编写了数据,如下所示:

<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>