标签: xmlserializer

XmlSerializer - 具有不同属性的相同元素

预期的XML输出:

<add>
 <doc>
  <field name="id">1</field>
  <field name="Myname">MyName1</field1>
 </doc>
 <doc>
  <field name="id">2</field>
  <field name="Myname">MyName2</field>
 </doc>
 <doc>
  <field name="id">3</field>
  <field name="Myname">MyName3</field>
 </doc>
</add>
Run Code Online (Sandbox Code Playgroud)

为了获得上述XML文档,我设计了以下类

public class doc
{
    [XmlElement("field")]
    public ID Id
    {
        get;
        set;
    }
    [XmlElement("field2")]
    public Name Myname
    {
        get;
        set;
    }
}
Run Code Online (Sandbox Code Playgroud)

名称类将是

 public class Name 
{
    [XmlText]
    public string Namevalue
    {
        get;
        set;
    }
    [XmlAttribute("name")]
    public string Myname
    {
        get;
        set;
    } 
}
Run Code Online (Sandbox Code Playgroud)

XmlSerializer代码:

XmlSerializer serializer = new XmlSerializer(typeof(List<doc>), new XmlRootAttribute("add"));
Run Code Online (Sandbox Code Playgroud)

这给了我以下输出

<add>
 <doc>
  <field name="id">1</field>
  <field2 name="Myname">MyName1</field2> …
Run Code Online (Sandbox Code Playgroud)

c# xml-serialization xmlserializer

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

在将XmlSerializer用于列表时,我可以省略干预级别吗?

我的问题最好通过一个简单的例子来描述.考虑这样的2个类:

class Order {
  [XmlAttribute] int orderId;
  [XmlAttribute] int customerId;
  List<OrderItem> items;
}

class OrderItem {
  [XmlAttribute] int partCode;
  [XmlAttribute] int quantity;
}
Run Code Online (Sandbox Code Playgroud)

使用XmlSerializer,这将序列化为这样的:

<order orderId="...", customerId="..." >
  <Items>
    <orderItem partCode="..." quantity="..." />
  </Items>
</order>
Run Code Online (Sandbox Code Playgroud)

我想要做的是删除<Items>级别,以便<orderItem>元素直接在相应的<order>下面

有没有办法做到这一点?

.net c# xml xmlserializer

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

.NET XmlSerializer:如何替换xml标记的名称?

对于某些数据导出,我们正在做的只是使用XmlSerializer序列化.Net对象,如列表或集合.我们使用这样的东西:

public static bool WriteToXMLFile(string fullFileNameWithPath, Object obj, Type ObjectType)
        {
            TextWriter xr = null;
            try
            {
                XmlSerializer ser = new XmlSerializer(ObjectType);
                xr = new StreamWriter(fullFileNameWithPath);
                ser.Serialize(xr, obj);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if(xr != null)
                    xr.Close();
            }
            return true;
        }
Run Code Online (Sandbox Code Playgroud)

对于类型列表,生成的XML类似于以下段:

<ArrayOfMyObjects>
    <MyObject>
    //content here
    </MyObject>
</ArrayOfMyObjects>
Run Code Online (Sandbox Code Playgroud)

但另一方面的期望(这个文件的接收者是这样的:

<MT_MyObjects>
    <MyObject>
    //content here
    </MyObject>
</MT_MyObjects>
Run Code Online (Sandbox Code Playgroud)

那么如何在序列化时将ArrayOfMyObjects更改为MT_MyObjects?我知道也可以使用一些Regx替换来完成.但我希望以后不要触摸输出.

更新:解决方案:

我最终可以像这样解决问题:

[Serializable]
[XmlRoot("MT_LoadProfile")]
public class LoadProfArray : List<LoadProfile>
{
    //....
}
Run Code Online (Sandbox Code Playgroud)

.net xmlserializer

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

序列化另一个元素中的0-n个元素

我有两个这样的课程:

public class Product
{
    public string Name { get; set; }
    public int Id { get; set; }
}

public class Category
{
    public string CategoryName { get; set; }
    public List<Product> Products { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

有没有什么方法可以在Category类上装饰我的Products属性,所以它是这样序列化的?

    <Container>
      <Category>
        <CategoryName>Unicorn Stuff</CategoryName>
        <Product>
          <Id>1212</Id>
          <Name>Unicorn Dust</Name>
        </Product>
        <Product>
          <Id>1829</Id>
          <Name>Horn Extension</Name>
        </Product>
        <Product>
          <Id>27373</Id>
          <Name>Facemask with hole</Name>
        </Product>
      </Category>
      <Category>
        <CategoryName>Pixie</CategoryName>
        <Product>
          <Id>222</Id>
          <Name>Pixie Dust</Name>
        </Product>    
      </Category>
    </Container>
Run Code Online (Sandbox Code Playgroud)

请注意,每个类别都有类别元素(类别名称)和0-n Product子元素.

...或者我是否需要以更加手动的方式生成文档?

(这不是我设计xml结构的方式,但是嘿 - 我们生活在一个不完美的世界)

.net c# xml-serialization xmlserializer

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

使用XMLSerializer将文本写入XML而不转义它

我正在尝试使用XMLSerializer将文本写入XML文件.text(String)-function自动转义字符.

将其添加到xml-File时是否可以不转义文本?

如果不可能,您是否可以推荐一个简单的解决方法,而无需重写我的所有XML创建代码?

谢谢

xml android xml-serialization xmlserializer

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

使用XmlSerializer将xml元素反序列化为Array不起作用

我想将以下xml反序列化到我的类中,我无法更改xml,因为它通过tcp/ip来自设备.

<?xml version="1.0" encoding="utf-8"?>
<CONTACTINFORMATION UID="1234">
 <LoginId><![CDATA[1234]]></LoginId>
<ContactId><![CDATA[2134]]></ContactId>
<ContactType>CCININTERN</ContactType>
<Status>CONVERSATION</Status>
<From><![CDATA[123]]></From>
<To><![CDATA[123]]></To>
<WaitTime><![CDATA[123]]></WaitTime>

<ContactPropertySummary>
  <ContactProperty>
    <Name><![CDATA[13]]></Name>
    <Value><![CDATA[13]]></Value>
    <Hidden>NO</Hidden>
    <Url><![CDATA[13]]></Url>
  </ContactProperty>
</ContactPropertySummary>

<SkillSummary>
  <Skill>
    <Name><![CDATA[123]]></Name>
    <Mandatory>YES</Mandatory>
  </Skill>

  <Skill>
    <Name><![CDATA[124]]></Name>
    <Mandatory>YES</Mandatory>
  </Skill>
</SkillSummary>

<ContactCodeSummary>
  <ContactCode>
    <Id>123</Id>
    <Hidden>NO</Hidden>
    <Assigned>YES</Assigned>
  </ContactCode>

</ContactCodeSummary>
<GroupSummary>
  <Group>
    <Name><![CDATA[123]]></Name>
    <Mandatory>YES</Mandatory>
  </Group>

</GroupSummary>
<PreviousAgent><![CDATA[2]]></PreviousAgent>
<ScratchPadId><![CDATA[2]]></ScratchPadId>
<ScratchPadData><![CDATA[2]]></ScratchPadData>
<FaxSpecific>
  <NbrOfPages>2</NbrOfPages>
</FaxSpecific>
 </CONTACTINFORMATION>
Run Code Online (Sandbox Code Playgroud)

我的课:

 [Serializable]
 [XmlRoot("CONTACTINFORMATION")]
 public class Contact
  {
    #region :: PROPERTIES ::
    public string LoginId { get; set; }
    public string ContactId { get; set; }
    public ContactType ContactType { …
Run Code Online (Sandbox Code Playgroud)

.net c# xmlserializer deserialization

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

在嵌套属性上使用XmlAttributeOverrides

我试图使用XmlAttributeOverrides来控制哪些类属性在序列化后显示在xml中。它适用于“根”类上的属性,但不适用于嵌套属性。这是一个简单的示例,以说明我要完成的工作。

我的班级层次结构如下:

public class Main
{
    public string Name { get; set; }
    public Location Address { get; set; }
}

public class Location
{
    public string StreetAddress { get; set; }
    public Contact ContactInfo{ get; set; }
}

public class Contact
{
    public string PhoneNumber { get; set; }
    public string EmailAddr { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

当我序列化Main()时,我得到如下信息:

<Main>
    <Name></Name>
    <Address>
        <StreetAddress></StreetAddress>
        <ContactInfo>
            <PhoneNumber></PhoneNumber>
            <EmailAddr></EmailAddr>
        </ContactInfo>
    </Address>
</Main>
Run Code Online (Sandbox Code Playgroud)

我所能做的就是通过使用以下命令来避免显示名称或地址:

XmlAttributeOverrides overrides = new XmlAttributeOverrides();
XmlAttributes attribs = new XmlAttributes(); …
Run Code Online (Sandbox Code Playgroud)

c# class xml-attribute xmlserializer xmlignore

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

XMLSerializer并使用属性创建XML数组

我正在尝试创建一个可以通过XMLSerializer序列化为XML的类.

目标XML应该看起来像这样

<subject_datas type="array">
    <subject_data>
           ...
    </subject_data>
    <subject_data>
           ...
    </subject_data>
</subject_datas>
Run Code Online (Sandbox Code Playgroud)

问题是subject_datas标记的type属性.我尝试的是将其设计为派生List并附加具有XMLAttribute属性的属性

[XmlRoot(ElementName = "subject_datas")]
public class SubjectDatas : List<SubjectData>
{
    public SubjectDatas (IEnumerable<SubjectData> source)
    {
        this.AddRange(source);
        Type = "array";
    }

    [XmlAttribute(AttributeName = "type")]
    public string Type { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

但是因为类是Collection,所以XMLSerializer将序列化Collection中的对象而不是Collection本身.所以我的Type属性被忽略了:(

c# highrise xmlserializer

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

Stackoverflow序列化类时的异常

我有一棵树,想要将它们序列化为xml.节点派生自Nodebase类(我认为在这里找到),它在序列化时失败.

public class NodeBase : IEqualityComparer, IEnumerable, IEnumerable<NodeBase>
{

    public NodeBase Parent { get; private set; }

    private readonly IList<NodeBase> children = new ObservableCollection<NodeBase>();

    public NodeBase this[int index]
    {
        get
        {
            return this.children[index];
        }
    }

    public void AddChild(NodeBase childNode, int index = -1)
    {
        if (index < -1)
        {
            throw new ArgumentException("The index can not be lower then -1");
        }
        if (index > this.Children.Count() - 1)
        {
            throw new ArgumentException("The index ({0}) can not be higher then index of the …
Run Code Online (Sandbox Code Playgroud)

c# exception xmlserializer

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

C#XMlSerializer中具有特殊字符的XML反序列化

我有一个包含一些特殊字符“&是引起问题的特殊字符的xml工作表,我使用下面的代码反序列化XML

           XMLDATAMODEL imported_data;

            // Create an instance of the XmlSerializer specifying type and namespace.
            XmlSerializer serializer = new XmlSerializer(typeof(XMLDATAMODEL));

            // A FileStream is needed to read the XML document.
            FileStream fs = new FileStream(path, FileMode.Open);
            XmlReader reader = XmlReader.Create(fs);


            // Use the Deserialize method to restore the object's state.
            imported_data = (XMLDATAMODEL)serializer.Deserialize(reader);
            fs.Close();
Run Code Online (Sandbox Code Playgroud)

我的XML MOdel的structre是这样的

    [XmlRoot(ElementName = "XMLDATAMODEL")]
    public class XMLDATAMODEL
    {
        [XmlElement(ElementName = "EventName")]
        public string EventName { get; set; }
        [XmlElement(ElementName = "Location")]
        public …
Run Code Online (Sandbox Code Playgroud)

c# xml xmlserializer

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