标签: xml-serialization

JAXB 中的自定义序列化

有没有办法在 JAXB 中自定义 XML 序列化,就像在 .NET 中使用 IXmlSerializable 一样?(即使用等效的 XmlReader/Writer 直接控制对象序列化的能力)。

我查看了 XmlAdapter 和 @XmlJavaTypeAdapter,但它们似乎只是用于在类型与可序列化形式之间进行转换,这并不是我想要的。

更新:特别是,我想自定义根对象的反序列化,以编程方式确定如何反序列化内部 XML(例如,使用一组特定的已知类型创建一个 jaxb unmarshaller)。

更新:我找到了解决问题的方法,但这是一个令人讨厌的黑客攻击,我可能会采用其他海报建议的解决方案之一。

java xml jaxb xml-serialization

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

Why can't I add attributes when serializing ObservableCollection<T>?

我正在尝试使用一些自定义属性扩展 ObservableCollection 并对其进行序列化。但是,我似乎无法让它序列化这些属性。我正在使用 .NET 4.0,他们修复了 ObservableCollection 的序列化问题,但仍然有问题。我的预感是 GetObjectData 是在基类上调用的,而不是我的。有任何想法吗?

[Serializable]
[XmlRoot(ElementName = "MyCollection")]
public class MyCollection : ObservableCollection<MyItem>, ISerializable
{
    private string name;

    void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
    {
        info.AddValue("Name", Name);
    }

    private MyCollection()
    {
        Name = string.Empty;
    }

    public MyCollection(string name)
    {
        Name = name;
    }

    public MyCollection(SerializationInfo info, StreamingContext context)
    {
        Name = (string)info.GetValue("Name", typeof(string));
    }

    [XmlAttribute]
    public string Name
    {
        get { return name; }
        protected set
        {
            string originalName = name;
            name = value;
            if (originalName …
Run Code Online (Sandbox Code Playgroud)

wpf inheritance serialization xml-serialization observablecollection

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

XmlAttribute/XmlText不能用于编码复杂类型

我想将一个类序列Ticket化为xml.我得到错误:"XmlAttribute/XmlText不能用于编码复杂类型"因为我的自定义类.

这就是自定义域的xml应该是这样的(属性数组是nesseray但我不明白如何创建它):

<custom_fields type="array">
<custom_field name="Standby Reason" id="6">
<value/>
</custom_field>
<custom_field name="Close Date" id="84">
Run Code Online (Sandbox Code Playgroud)

班级门票

public class Ticket
{
    [XmlElement("custom_fields")]
    public CustomFields Custom_fields { get; set; }
Run Code Online (Sandbox Code Playgroud)

类CustomFields

[Serializable]
public class CustomFields
{
    [XmlAttribute("array")]
    public List<CustomField> custom_field { get; set; }
Run Code Online (Sandbox Code Playgroud)

类CustomField

[Serializable]
public class CustomField
{
    [XmlIgnore]
    public string Name { get; set; }

    [XmlElement]
    public int Id { get; set; }

    [XmlElement]
    public string Value { get; set; }
Run Code Online (Sandbox Code Playgroud)

序列化方法

public string Serialize(object obj)
{
    var …
Run Code Online (Sandbox Code Playgroud)

.net c# xml serialization xml-serialization

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

WinRT中最后一次编辑xml文件的时间 - Windows 8 - Metro App

我的问题如下.我想知道是否有可能知道xml文件的最后编辑时间.

目前我正在创建我的xml并以下列方式从我的xml中读取:

这是写作部分,我正在序列化一个可观察的集合:

XmlSerializer xs = new XmlSerializer(typeof(ObservableCollection<DomExistingVacationDays>));
                using (IRandomAccessStream sessionRandomAccess = await VacationRequestOfflineHolidaysFile.OpenAsync(FileAccessMode.ReadWrite))
                {
                    using (IOutputStream sessionOutputStream = sessionRandomAccess.GetOutputStreamAt(0))
                    {
                        using (StreamWriter wr = new StreamWriter(sessionOutputStream.AsStreamForWrite()))
                        {
                            xs.Serialize(wr, _existingHolidaysCollection);
                        }
                    }

                }
Run Code Online (Sandbox Code Playgroud)

这是阅读部分,反序列化可观察集合:

 XmlSerializer xs = new XmlSerializer(typeof(ObservableCollection<DomExistingVacationDays>));
                using (IRandomAccessStream sessionRandomAccess = await VacationRequestOfflineHolidaysFile.OpenAsync(FileAccessMode.ReadWrite))
                {
                    using (IInputStream sessionInputStream = sessionRandomAccess.GetInputStreamAt(0))
                    {
                        using (StreamReader rd = new StreamReader(sessionInputStream.AsStreamForRead()))
                        {
                            _existingHolidaysCollection = xs.Deserialize(rd) as ObservableCollection<DomExistingVacationDays>;
                        }
                    }

                }
Run Code Online (Sandbox Code Playgroud)

我想要实现的是,当xml文件中的数据比几天的数据更旧时,我不再希望使用它.

所以我可以在xml文件中添加日期时间,但我想知道是否没有任何其他解决方案来解决这个问题.

日Thnx!

c# datetime xml-serialization windows-8 windows-runtime

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

使用 XmlSerializer 设置 xml 标头

我的 xml 看起来像这样...

我有这个固定的标题,我需要附加到我正在编写的任何 xml 文件中,我该怎么做?

**<?xml version="1.0"?>
<!DOCTYPE profile SYSTEM "criteria_profile.dtd">**
<profile type="INTERC" id="6 " description="MushonTest" state="" lastchuser="MUSHON" lastchtmstmp="20130903132018 " createuser="MUSHON">
    <root>
        <node type="A">
            <item description="crite3">
                <field>AUTHCKMAN<criterion sign="I" opt="EQ" low="cl" high=""/>
                </field>
                <field>JOBCLASS<criterion sign="I" opt="EQ" low="clas" high=""/>
                </field>
                <field>JOBNAME<criterion sign="I" opt="EQ" low="nam" high=""/>
                </field>
                <field>SDLUNAME<criterion sign="I" opt="EQ" low="creat" high=""/>
                </field>
            </item>
Run Code Online (Sandbox Code Playgroud)

c# xml-serialization

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

xmlserializernamespaces 将命名空间添加到特定元素

我有一个对象,我想序列化它。我想将命名空间添加到 xml 文档的特定元素。我从 1 个默认 xml 创建了多个 .xsd 文件。我使用 XmlSerializer。

命名空间应该在<sos:element. 这就是我想要的:

<env:root
  xmls:env ="httpenv"
  xmlns:sos="httpsos">
   <env:body>
     <sos:element 
       xmlns:abc="" <--------------my namespaces are located in <sos:element
       ...
Run Code Online (Sandbox Code Playgroud)

如果我使用类似的东西

XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("abc", "httpabc");
ns.add....
StringWriter stringWriter = new StringWriter();   
serializer.Serialize(stringWriter, ObjectToSerialize, ns);
Run Code Online (Sandbox Code Playgroud)

我将得到以下内容

<env:root
  xmls:env ="httpenv"
  xmlns:sos="httpsos"
  xmlns:abc="" <-------------I do not want it here; I want it in <sos:element
   <env:body>
     <sos:element> 
      ...
Run Code Online (Sandbox Code Playgroud)

有没有办法指定我想要在哪里(在哪个元素中)声明我的命名空间,或者它们都在根元素中声明?

c# xml-serialization xmlserializer

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

如何使用 DOMDocument 编写 XML 自结束标记

我正在使用 PHP 生成 XML,我正在使用 DOMDocument 生成 XML 标签。如何使用 DOMDocument 创建自关闭标签?

$doc2 = new DOMDocument();
$root2 = $doc2->createElement('root', '');
Run Code Online (Sandbox Code Playgroud)

预期输出:

<?xml version="1.0"?><root/>
Run Code Online (Sandbox Code Playgroud)

实际结果:

<?xml version="1.0"?><root></root>
Run Code Online (Sandbox Code Playgroud)

还有其他方法可以生成自关闭标签吗?

PS:请不要关闭问题,因为我认为这不是重复的。谢谢。

php xml xml-serialization domdocument xml-parsing

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

使用.NET XmlSerializer进行反序列化时,请使用多个名称空间

我正在尝试使用两个名称空间反序列化XML,就像这样

<records xmlns="http://www.foo.com/xml/records/1.1">
    <record xmlns="http://www.foo.com/xml/record/1.1">
Run Code Online (Sandbox Code Playgroud)

有时候是旧版本

<records xmlns="http://www.foo.com/xml/records/1.1">
    <record xmlns="http://www.foo.com/xml/record/1.0">
Run Code Online (Sandbox Code Playgroud)

我的Records.cs类有

[XmlRoot(ElementName = "records", Namespace = "http://www.foo.com/xml/records/1.1")]
public class Records
{
    [System.Xml.Serialization.XmlElementAttribute("record")]
    public List<Record> Records { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我希望记录列表能够包含版本1.0或版本1.1记录

/// <remarks/>
[XmlRoot(IsNullable = false, ElementName = "record", Namespace = "http://www.foo.com/xml/record/1.0")]
public partial class Record
{


    /// <remarks/>

    public Record()
    {

    }
}

/// <remarks/>
[XmlRoot(IsNullable = false, ElementName = "record", Namespace = "http://www.foo.com/xml/record/1.1")]
public partial class Record11 : Record
{
    /// <remarks/>
    public Record11()
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

所以我假设子类化记录会起作用. …

c# namespaces xml-serialization

0
推荐指数
1
解决办法
6351
查看次数

使用没有xsd文件的模式读取XML

我本周收到了一个复杂的XML文件,它基于模式,但我没有收到任何xsd文件,我需要读取这个文件的每个节点.

下面的XML示例:

<xc:XmlTest xmlns:xc="XmlTest" xmlns:mp="bs.TestParameters" xmlns:rt="bs.TestParameters.Parameter1" xmlns:rtcu="bs.TestParameters.Parameter1.Var">
<xc:XmlTestArea xc:value="TestParameters">
    <mp:Name xc:Value="raddesso" xmlns:mp="bs.TestParameters">
        <mp:Date xc:Value="20130215">
            <rt:RunTest xmlns:rt="bs.TestParameters.Parameter1">
                <rtcu:Var xmlns:rtcu="bs.TestParameters.Parameter1.Var">
                    <mp:FinalValue>1234</mp:FinalValue>
                </rtcu:Var>
            </rt:RunTest>
        </mp:Date>
        <mp:Date xc:Value="20130216">
            <rt:RunTest xmlns:rt="bs.TestParameters.Parameter1">
                <rtcu:Var xmlns:rtcu="bs.TestParameters.Parameter1.Var">
                    <mp:FinalValue>23234</mp:FinalValue>
                </rtcu:Var>
            </rt:RunTest>
        </mp:Date>
    </mp:Name>
</xc:XmlTestArea>
</xc:XmlTest>
Run Code Online (Sandbox Code Playgroud)

这只是使用虚假数据的真实文件的示例.

有没有办法在这个节点上做foreach从每个日期找到FinalValue?

c# xml xmlnodelist xmlreader xml-serialization

0
推荐指数
1
解决办法
3058
查看次数

C#serializer跳过属性

我有一个类DocumentMetaData,我正在尝试序列化为XML.它是一个公共类,其中的所有元素都是公共的,但有一个元素不会出现在XML输出中,但应该是.(另一个用XmlIgnore标记.)我试图找出为什么跳过这个元素.

public class DocumentMetaData
{
  [XmlElement(ElementName="docType")]
  public string DocType { get; set; }

  [XmlElement(ElementName = "companyName")]
  public string CompanyName { get; set; }

  [XmlElement(ElementName = "countryName")]
  public string CountryName { get; set; }

  [XmlElement(ElementName = "clientName")]
  public string ClientName { get; set; }

  [XmlElement(ElementName = "manufacturer")]
  public string Manufacturer { get; set; }

  [XmlIgnore]
  public DateTime ConversionDate { get; set; }

  [XmlElement(ElementName = "conversionDate")]
  public string ConversionDateString
  {
     get { return ConversionDate.ToShortDateString(); }
  }
Run Code Online (Sandbox Code Playgroud)

}

生成的XML如下所示:

<docMeta>
    <docType>Text</docType>
    <companyName>Text</companyName>
    <countryName>Text</countryName> …
Run Code Online (Sandbox Code Playgroud)

c# xml xml-serialization

0
推荐指数
1
解决办法
145
查看次数