有没有办法在 JAXB 中自定义 XML 序列化,就像在 .NET 中使用 IXmlSerializable 一样?(即使用等效的 XmlReader/Writer 直接控制对象序列化的能力)。
我查看了 XmlAdapter 和 @XmlJavaTypeAdapter,但它们似乎只是用于在类型与可序列化形式之间进行转换,这并不是我想要的。
更新:特别是,我想自定义根对象的反序列化,以编程方式确定如何反序列化内部 XML(例如,使用一组特定的已知类型创建一个 jaxb unmarshaller)。
更新:我找到了解决问题的方法,但这是一个令人讨厌的黑客攻击,我可能会采用其他海报建议的解决方案之一。
我正在尝试使用一些自定义属性扩展 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
我想将一个类序列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) 我的问题如下.我想知道是否有可能知道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!
我的 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) 我有一个对象,我想序列化它。我想将命名空间添加到 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)
有没有办法指定我想要在哪里(在哪个元素中)声明我的命名空间,或者它们都在根元素中声明?
我正在使用 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:请不要关闭问题,因为我认为这不是重复的。谢谢。
我正在尝试使用两个名称空间反序列化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)
所以我假设子类化记录会起作用. …
我本周收到了一个复杂的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?
我有一个类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# ×7
xml ×5
.net ×1
datetime ×1
domdocument ×1
inheritance ×1
java ×1
jaxb ×1
namespaces ×1
php ×1
windows-8 ×1
wpf ×1
xml-parsing ×1
xmlnodelist ×1
xmlreader ×1