标签: xml-deserialization

将XElement反序列化为类

我试图将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)

c# xml xml-deserialization

19
推荐指数
1
解决办法
2万
查看次数

反序列化枚举

我有一个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)

我该如何处理这种情况

.net c# xml xml-deserialization

17
推荐指数
3
解决办法
2万
查看次数

使用对先前标记的引用解析XML,并使用与某些类的子类型对应的子代

我必须处理以下场景(的变体).我的模型类是:

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绝不是必需品,最优雅的解决方案赢得赏金.)

java xstream xml-deserialization xml-parsing

17
推荐指数
1
解决办法
1929
查看次数

如何使用DataContractSerializer反序列化XML

我正在尝试反序列化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)

.net c# asp.net datacontractserializer xml-deserialization

17
推荐指数
1
解决办法
4万
查看次数

将xml反序列化为对象时出错:System.FormatException输入字符串的格式不正确

您好,并提前感谢您的帮助.尝试使用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)

c# xml silverlight xml-serialization xml-deserialization

16
推荐指数
1
解决办法
3万
查看次数

使用XML装饰在反序列化期间指定默认值

我有一个问题反序列化一些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

15
推荐指数
1
解决办法
2万
查看次数

如何为XmlElement字段定义多个名称?

我有一个客户端应用程序提供给我的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名称parentIdLeParentId

这是我目前用于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)

c# xml xml-deserialization

15
推荐指数
3
解决办法
8315
查看次数

XML文档中的反序列化错误(1,1)

我有一个我反序列化的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)

c# xml-deserialization

13
推荐指数
1
解决办法
3万
查看次数

通过C#中的XmlSerializer类反序列化多个具有相同名称的XML元素

我在表单中有一个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,我需要再次序列化它.

我没有任何帮助就搜索了很多.任何想法将受到高度赞赏.

谢谢...

c# xml xml-serialization xml-deserialization

13
推荐指数
2
解决办法
2万
查看次数

C# - 具有属性和节点值的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")?

.net c# xml xml-deserialization

13
推荐指数
1
解决办法
6232
查看次数