我试图将XML文件反序列化为几个类对象:艺术家,专辑和歌曲
这是当前的设置:
static void Main(string[] args)
{
var riseAgainst = DeSerializer(CreateElement());
Console.WriteLine(string.Format("Band: {0}",riseAgainst.Name));
Console.WriteLine("-----------------------------");
Console.WriteLine(string.Format("Album: {0}",riseAgainst.Album.Name));
Console.WriteLine("-----------------------------");
Console.WriteLine("Song List:\r");
foreach(var s in riseAgainst.Album.Songs)
{
Console.WriteLine(string.Format("Song: {0}", s));
}
Console.ReadLine();
}
static XElement CreateElement()
{
return new XElement("Artist",
new XElement("Name", "Rise Against"),
new XElement("Album",
new XElement("Name", "Appeal to Reason"),
new XElement("Songs",
new XElement("Song", "Hero of War"),
new XElement("Song", "Savior"))
)
);
}
static Artist DeSerializer(XElement element)
{
var serializer = new XmlSerializer(typeof(Artist));
return (Artist)serializer.Deserialize(element.CreateReader());
}
}
public class Artist
{
public …Run Code Online (Sandbox Code Playgroud) 我有一个xml,其中一个元素的属性可以为空.例如,
<tests>
<test language="">
.....
</test>
</tests>
Run Code Online (Sandbox Code Playgroud)
现在,语言是从模式创建的类中的枚举类型.如果指定了语言,它可以正常工作,如果它是空白则无法反序列化(如示例所示).
编辑:反序列化的代码:
XmlSerializer xmlserializer = new XmlSerializer(type);
StringReader strreader = new StringReader(stringXML);
Object o = serializer.Deserialize(strreader);
Run Code Online (Sandbox Code Playgroud)
我该如何处理这种情况
我必须处理以下场景(的变体).我的模型类是:
class Car {
String brand;
Engine engine;
}
abstract class Engine {
}
class V12Engine extends Engine {
int horsePowers;
}
class V6Engine extends Engine {
String fuelType;
}
Run Code Online (Sandbox Code Playgroud)
我必须反序列化(不需要序列化支持ATM)以下输入:
<list>
<brand id="1">
Volvo
</brand>
<car>
<brand>BMW</brand>
<v12engine horsePowers="300" />
</car>
<car>
<brand refId="1" />
<v6engine fuel="unleaded" />
</car>
</list>
Run Code Online (Sandbox Code Playgroud)
我尝试/发布的内容:
我尝试过使用XStream,但它希望我写下这样的标签:
<engine class="cars.V12Engine">
<horsePowers>300</horsePowers>
</engine>
Run Code Online (Sandbox Code Playgroud)
等等.(我不想要的<engine>-标签,我想<v6engine>-标签或一个<v12engine>-标记.
此外,我需要能够根据标识符返回"预定义"品牌,如上面的品牌ID所示.(例如,Map<Integer, String> predefinedBrands在反序列化期间保持一个).我不知道XStream是否适合这种情况.
我意识到这可以通过推或拉解析器(例如SAX或StAX)或DOM库"手动"完成.但是我希望有更多的自动化.理想情况下,我应该能够添加类(例如new Engines)并立即开始在XML中使用它们.(XStream绝不是必需品,最优雅的解决方案赢得赏金.)
我正在尝试反序列化xml文档:
<?xml version="1.0"?>
<games xmlns = "http://serialize">
<game>
<name>TEST1</name>
<code>TESTGAME1</code>
<ugn>1111111</ugn>
<bets>
<bet>5,00</bet>
</bets>
</game>
<game>
<name>TEST2</name>
<code>TESTGAME2</code>
<ugn>222222</ugn>
<bets>
<bet>0,30</bet>
<bet>0,90</bet>
</bets>
</game>
</games>
Run Code Online (Sandbox Code Playgroud)
.cs类:
namespace XmlParse
{
using System.Collections.Generic;
using System.Runtime.Serialization;
[DataContract(Namespace = "http://serialize")]
public class game
{
#region Public Properties
[DataMember]
public string name { get; set; }
[DataMember]
public string code { get; set; }
[DataMember]
public long ugn { get; set; }
[DataMember]
public List<decimal> bets { get; set; }
#endregion
}
[KnownType(typeof(game))]
[DataContract(Namespace = …Run Code Online (Sandbox Code Playgroud) 您好,并提前感谢您的帮助.尝试使用XmlSerializer和StringReader将XElement反序列化为对象时遇到问题.我的反序列化代码是这样的:
/*deseierialize a single RegisterServerObject instance from xml*/
static RegisterServerObject DeserializeSingleServerFromXml(XElement serverElement)
{
XmlSerializer deserializer = new XmlSerializer(typeof(RegisterServerObject));
RegisterServerObject server;
using (var reader = new StringReader(serverElement.ToString()))
server = (RegisterServerObject)deserializer.Deserialize(reader);
return server;
}
Run Code Online (Sandbox Code Playgroud)
我知道例外所揭示的读者内容是:
<Server>
<ServerID>11</ServerID>
<GroupID />
<ParentID>15</ParentID>
<ServerName>IAProd1</ServerName>
<User>admin</User>
<UID>123</UID>
<PWD>password</PWD>
<Domain>InputAccel</Domain>
<Location>Left</Location>
<AssociatedModules>
<Module>
<ModId>1</ModId>
<ServerId>11</ServerId>
<ModName>TestModA</ModName>
<ModuleStatus>1</ModuleStatus>
</Module>
<Module>
<ModId>2</ModId>
<ServerId>11</ServerId>
<ModName>TestModB</ModName>
<ModuleStatus>1</ModuleStatus>
</Module>
<Module>
<ModId>9</ModId>
<ServerId>11</ServerId>
<ModName>TestModI</ModName>
<ModuleStatus>1</ModuleStatus>
</Module>
<Module>
<ModId>10</ModId>
<ServerId>11</ServerId>
<ModName>TestModJ</ModName>
<ModuleStatus>1</ModuleStatus>
</Module>
</AssociatedModules>
</Server>
Run Code Online (Sandbox Code Playgroud)
我的RegisterServerObject类如下所示:
[XmlRoot("Server")]
public class RegisterServerObject
{
public RegisterServerObject() { …Run Code Online (Sandbox Code Playgroud) 我有一个问题反序列化一些XML; 由第三方提供的XML非常冗长,因此如果没有为特定元素设置值,它将提供并清空元素(例如<element1 />).
这是某些元素的问题,例如,那些用于存储整数的元素.我可以控制第三方,所以我可以让他们指定默认值(<myinteger>0</myinteger>)或者我可以让他们完全省略这些元素.这两个都应该避免这个问题.
但是,将来可能会出现这样的情况,即我们没有那么多控制权 - 在这种情况下,是否有一种方法可以通过装饰指定默认值?
[XmlElement("myinteger")=0???]
public int MyInteger
{
get
{
return myInteger;
}
set
{
myInteger= value;
}
}
Run Code Online (Sandbox Code Playgroud) c# serialization xml-serialization default-value xml-deserialization
我有一个客户端应用程序提供给我的C#应用程序的XML文档.这是客户端发送XML文件的方式:
<?xml version="1.0" encoding="utf-8"?>
<SomeAccount>
<parentId>2380983</parentId>
<!-- more elements -->
</SomeAccount>
Run Code Online (Sandbox Code Playgroud)
还有一个支持XML反序列化的C#类:
[XmlRoot]
public class SomeAccount
{
[XmlElement("parentId")]
public long ParentId { get; set; }
//rest of fields...
}
Run Code Online (Sandbox Code Playgroud)
但是有一些客户端的系统以这种方式发送XML(请注意大写LeParentId):
<?xml version="1.0" encoding="utf-8"?>
<SomeAccount>
<LeParentId>2380983</LeParentId>
<!-- similar for the other elements -->
</SomeAccount>
Run Code Online (Sandbox Code Playgroud)
如何使这个字段(和其他字段)支持XML名称parentId和LeParentId?
这是我目前用于XML反序列化的方法:
public sealed class XmlSerializationUtil
{
public static T Deserialize<T>(string xml)
{
if (xml == null)
return default(T);
XmlSerializer serializer = new XmlSerializer(typeof(T));
StringReader stringReader = new StringReader(xml);
return (T)serializer.Deserialize(stringReader); …Run Code Online (Sandbox Code Playgroud) 我有一个我反序列化的XML文件,有趣的部分是使用以下代码序列化的XML文件:
enter code here
var serializer = new XmlSerializer(typeof(CommonMessage));
var writer = new StreamWriter("OutPut.txt");
serializer.Serialize(writer, commonMessage);
writer.Close();
Run Code Online (Sandbox Code Playgroud)
我试图再次反序列化以检查输出是否与输入匹配.无论如何,这是我反序列化的代码:
var serializer = new XmlSerializer(typeof(CommonMessage));
var reader = new StringReader(InputFileName);
CommonMessage commonMessage = (CommonMessage)serializer.Deserialize(reader);
Run Code Online (Sandbox Code Playgroud) 我在表单中有一个XML
<BackupSchedule>
<AggressiveMode>0</AggressiveMode>
<ScheduleType>0</ScheduleType>
<ScheduledDay>0</ScheduledDay>
<ScheduledDay>1</ScheduledDay>
<ScheduledDay>0</ScheduledDay>
<ScheduledDay>0</ScheduledDay>
<ScheduledDay>0</ScheduledDay>
<ScheduledDay>0</ScheduledDay>
<ScheduledDay>0</ScheduledDay>
<WindowStart>480</WindowStart>
<WindowEnd>1020</WindowEnd>
<ScheduleInterval>0</ScheduleInterval>
</BackupSchedule>
Run Code Online (Sandbox Code Playgroud)
我需要对其进行反序列化,更改其内容并将其保存回来.我在阅读ScheduledDay元素时遇到问题.我的班级就像
public class BackupScheduleSettings
{
public BackupScheduleSettings()
{
ScheduledDay = new int[7];
}
.....
public int[] ScheduledDay { get; set; }
.....
}
Run Code Online (Sandbox Code Playgroud)
现在,当我加载具有ScheduledDay正确值的XML内容时,我的类数组仍为NULL.
我无法修改XML的内容/格式,因为它是遗留代码.我不想使用XDocument读取值,因为它是一个大型XML,我需要再次序列化它.
我没有任何帮助就搜索了很多.任何想法将受到高度赞赏.
谢谢...
我有一些Xml,我需要反序列化为一个对象.Xml是:
<Person>
<Type id="1234">Bob</Type>
</Person>
Run Code Online (Sandbox Code Playgroud)
这些课程是:
public class Person { public Type Type; }
public class Type {
[XmlAttribute("id")]
public string id;
// another property for value "Bob" here, such as:
public string value; // ????
}
Run Code Online (Sandbox Code Playgroud)
我想将这个Xml反序列XmlSerializer.Deserialize化为上面的具体对象(避免使用XPath等)
我可以用什么Xml属性来装饰"Type"类,这样我不仅有"id"属性而且还有值("Bob")?