gpt4 book ai didi

c# - 使用 Serializable() 从 XML 文件中填充一个数组

转载 作者:数据小太阳 更新时间:2023-10-29 02:39:30 28 4
gpt4 key购买 nike

我目前正在尝试使用 [Serializable()] 命令对象反序列化 XML,但我遇到了一些问题。这是代码示例:

using System;
using System.Xml.Linq;
using System.Xml.Serialization;
using System.IO;

namespace XmlManipulation
{
public class XmlManip
{
public static TestCasesList SerializeTest() //test function
{
TestCasesList testslist = null;
string path = @"C:\Users\sxtx2987\Documents\Visual Studio 2015\Projects\FDB\deleteme\test.xml";

XmlSerializer serializer = new XmlSerializer(typeof(TestCasesList));

StreamReader reader = new StreamReader(path);

testslist = (TestCasesList)serializer.Deserialize(reader);
reader.Close();
return testslist;
}
}


[Serializable()]
public class TestCase
{
[System.Xml.Serialization.XmlElement("name")]
public string name;

[System.Xml.Serialization.XmlElement("objective")]
public string objective;

[System.Xml.Serialization.XmlElement("criteria")]
public string criteria;

[System.Xml.Serialization.XmlElement("issue")]
public string issue;

[System.Xml.Serialization.XmlElement("clientcomments")]
public string clientcomments;

[System.Xml.Serialization.XmlElement("authoritycomments")]
public string authoritycomments;
}

[Serializable()]
[XmlType("testcaseslist")]
public class TestCasesList
{
[XmlArray("testcase")]
public TestCase[] TestCase { get; set; }
}
}

这是我要反序列化的文件

<xml version="1.00" encoding="UTF-8">
<campaign>
<name>Test XML</name>
<number>XXXXXG04-06-1</number>
<client>Fictional</client>
<model>Rocket powered boots</model>
<authority>Fictional authority</authority>
</campaign>

<testcaseslist>
<testcase>
<name>TestCase001</name>
<objective>Objective test 1</objective>
<criteria>Pass criteria test 1</criteria>
<issue>Issue Description test 1</issue>
<clientcomments>Client comments test 1</clientcomments>
<authoritycomments>Authority comments test 1</authoritycomments>
</testcase>

<testcase>
<name>TestCase002</name>
<objective>Objective test 2</objective>
<criteria>Pass criteria test 2</criteria>
<issue>Issue Description test 2</issue>
<clientcomments>Client comments test 2</clientcomments>
<authoritycomments>Authority comments test 2</authoritycomments>
</testcase>
</testcaseslist>
</xml>

我想要实现的是获取所有根元素“testcase”并将每个子元素(即:名称、目标、标准、问题、clientcomments、authoritycomments)放在一个由多个类 TestCase 组成的类 TestCasesList 中。

所以在这个例子中:

测试用例列表

|-> 测试用例 1

|-> 测试用例 2

|-> 等等......

其中包含测试用例的所有元素。

我上面的代码是我目前能收集到的,但由于这是我正在尝试执行的一个非常具体的操作,我无法找到所有相关信息来解决我的问题。

代码没有抛出任何错误,但是当我尝试调用该函数时

        TestCasesList test = null;

test = XmlManipulation.XmlManip.SerializeTest();

我得到一个空的测试对象。<​​/p>

我认为我的问题是 XmlType 和 XmlArray 部分,但经过几个小时的研究和试验,我仍然无法从 XML 中获取信息。

感谢您的宝贵时间。

最佳答案

这里有一些问题。

  1. 根元素可能不是您所想的那样。您的代码假定 <testcaseslist>是根元素。但实际上,以下是根元素:

    <xml version="1.00" encoding="UTF-8">
    <!-- XML Contents -->
    </xml>

    那个根看起来像一个标准的 XML 声明:

    <?xml version="1.0" encoding="UTF-8">

    但它缺少问号 <?xml>一开始。所以你需要修改你的代码来处理这个问题。您可以使用 XmlReader 跳转到适当的元素来完成此操作。 ,或反序列化适当的容器类型。

  2. 内部 <testcaseslist>元素 <testcase>未分组在容器元素下。因此你需要使用 [XmlElement("testcase")] 不是 [XmlArray("testcase")] .

  3. 要在类上声明根元素名称,您必须使用 [XmlRoot("testcaseslist")] 不是 [XmlType("testcaseslist")] .

因此您的 TestCasesList应该看起来像:

[XmlRoot("testcaseslist")]
public class TestCasesList
{
[XmlElement("testcase")]
public TestCase[] TestCase { get; set; }
}

然后,在您的 XML 中向前跳转并反序列化 <testcaseslist>元素,使用 XmlReader.ReadToFollowing() :

    public static TestCasesList Deserialize(TextReader reader)
{
using (var xmlReader = XmlReader.Create(reader))
{
// Skip to the <testcaseslist> element.
if (!xmlReader.ReadToFollowing("testcaseslist", ""))
return null;

var serializer = new XmlSerializer(typeof(TestCasesList));
return (TestCasesList)serializer.Deserialize(xmlReader);
}
}

在哪里reader是你的 StreamReader reader = new StreamReader(path); .

或者,使用容器类型:

[XmlRoot("xml")]
public class XmlRoot
{
public TestCasesList testcaseslist { get; set; }
}

你可以这样做:

    public static TestCasesList Deserialize(TextReader reader)
{
var serializer = new XmlSerializer(typeof(XmlRoot));
var root = (XmlRoot)serializer.Deserialize(reader);
return root == null ? null : root.testcaseslist;
}

可以通过从 XML 自动生成 C# 类来避免上面的一些困难,例如与 http://xmltocsharp.azurewebsites.net/ .有关更多信息,请参阅 Generate C# class from XML .

顺便说一句,[Serializable]XmlSerializer 没有影响.

关于c# - 使用 Serializable() 从 XML 文件中填充一个数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36463246/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com