我在MS Access数据库中有一组VBA类.我有一个xml字符串,其中包含我想要创建新类的数据.
除了单独设置每个属性之外,还有一种简单的方法可以将XML反序列化为我的对象吗?
我已经看到使用TypeLib库的代码
Public Sub ISerializable_Deserialize(xml As IXMLDOMNode)
Dim tTLI As TLIApplication
Dim tInvoke As InvokeKinds
Dim tName As String
Dim tMem As MemberInfo
tInvoke = VbLet
For Each tMem In TLI.ClassInfoFromObject(Me).Members
tName = LCase(tMem.Name)
CallByName Me, tMem.Name, VbLet, xml.Attributes.getNamedItem(tName).Text
Next tMem
End Sub
Run Code Online (Sandbox Code Playgroud)
但这似乎不适用于标准类模块.我收到429错误:
ActiveX Component Cannot Be Created
Run Code Online (Sandbox Code Playgroud)
其他人可以帮帮我吗?如果我可以提供帮助,我宁愿不必手动设置每个属性,这些类中的一些是巨大的!
我正在尝试关注有关XML序列化的微软教程,但是我遇到了一些问题!
这是XML文件,用作输入:
<?xml version="1.0" encoding="utf-8"?>
<Books xmlns:books="http://www.cpandl.com" xmlns:money="http://www.cohowinery.com">
<money:Book>
<books:TITLE>A Book Title</books:TITLE>
<money:PRICE books:currency="US Dollar">
<money:price>9.95</money:price>
</money:PRICE>
</money:Book>
</Books>
Run Code Online (Sandbox Code Playgroud)
这是绑定XML的类:
public class OrderedItem
{
[XmlElement(Namespace = "http://www.cpandl.com")]
public string ItemName;
[XmlElement(Namespace = "http://www.cpandl.com")]
public string Description;
[XmlElement(Namespace = "http://www.cohowinery.com")]
public decimal UnitPrice;
[XmlElement(Namespace = "http://www.cpandl.com")]
public int Quantity;
[XmlElement(Namespace = "http://www.cohowinery.com")]
public decimal LineTotal;
// A custom method used to calculate price per item.
public void Calculate()
{
LineTotal = UnitPrice * Quantity;
}
}
Run Code Online (Sandbox Code Playgroud)
该函数将XML读入'OrderedItem'类:
Console.WriteLine("Reading with …Run Code Online (Sandbox Code Playgroud) 使用simple-xml时,有没有办法让它忽略无法识别的节点?
这是从紧凑框架尝试获取http服务的代码.
List<Table> tables;
using (Stream r = response.GetResponseStream())
{
XmlSerializer serializer = new XmlSerializer(typeof(Table),"http://schemas.datacontract.org/2004/07/");
tables=(List<Table>) serializer.Deserialize(r);
}
response.Close();
Run Code Online (Sandbox Code Playgroud)
它失败了{"XML文档中存在错误(1,2)."}
{"<ArrayOfTable xmlns='http://schemas.datacontract.org/2004/07/WpfApplication1.Data.Model'> was not expected."}
Run Code Online (Sandbox Code Playgroud)
表命名空间是一样的...我不知道那里有什么错...
UPDATE
问题是我有typeof(表)而不是typeof(List<Table>)部分工作..没有错误但创建的表值为null!
我刚才有一些XStream存储的XML文件,它们包含对RandomAccessSubList的引用,这个类在包级别之外是不可见的,并且没有默认构造函数,所以XStream抛出了这个错误:
com.thoughtworks.xstream.converters.ConversionException: Cannot construct java.util.RandomAccessSubList as it does not have a no-args constructor : Cannot construct java.util.RandomAccessSubList as it does not have a no-args constructor
---- Debugging information ----
message : Cannot construct java.util.RandomAccessSubList as it does not have a no-args constructor
cause-exception : com.thoughtworks.xstream.converters.reflection.ObjectAccessException
cause-message : Cannot construct java.util.RandomAccessSubList as it does not have a no-args constructor*
Run Code Online (Sandbox Code Playgroud)
这是XML:
<customTimes class="java.util.RandomAccessSubList">
<l class="list">
<long>1302174300146</long>
<long>1302174305231</long>
<long>1302174310312</long>
Run Code Online (Sandbox Code Playgroud)
等等
我不能只为RandomAccessSubList编写一个转换器,因为它在util包之外是不可见的.如何告诉XStream忽略该属性的类,或者如何为我无法引用的类指定转换器?
提前致谢!
假设这样的XML:
<my:Root xmlns:my="http://foo/bar">
<my:FieldBasic>content</my:FieldBasic>
<my:FieldComplex>
<html xml:space="preserve" xmlns="http://www.w3.org/1999/xhtml">
<div><h1>content</h1></div>
</html>
</my:FieldComplex>
<my:Root>
Run Code Online (Sandbox Code Playgroud)
还有一个类:
[Serializable]
[XmlType(AnonymousType = true, Namespace = "http://foo/bar")]
[XmlRoot(ElementName = "Root", Namespace = "http://foo/bar", IsNullable = false)]
public class MyRoot
{
public string FieldBasic { get; set; }
public string FieldComplex { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
如何反序列化为<my:FieldComplex>内部的字符串FieldComplex?它在内部找到HTML时失败.我想让它给我一个包含这个内容的字符串:
<html xml:space="preserve" xmlns="http://www.w3.org/1999/xhtml">
<div><h1>content</h1></div>
</html>
Run Code Online (Sandbox Code Playgroud)
如果我宣布FieldComplex为public object FieldComplex(即xsd:anyType)它有点工作,我得到一个XMLNode[]里面,我可以使用.
但我需要FieldComplex序列化的类型字符串,因为序列化XML不包含HTML,它将像:
<my:Root xmlns:my="http://foo/bar">
<my:FieldBasic>content</my:FieldBasic>
<my:FieldComplex>content</my:FieldComplex>
<my:Root>
Run Code Online (Sandbox Code Playgroud)
声明FieldComplex为对象将在 …
c# serialization xml-serialization xml-deserialization deserialization
我想知道在JAXB中是否支持不同版本的类.我对它的看法:xml是类的一种持久化对象(序列化值),但是由于开发(例如扩展功能),可以改变类对象.有没有办法知道只使用JAXB API在持久性(read:xml)中存储哪个版本的类?
对我来说,存储类版本似乎很方便 - 就像它在标准的java序列化机制(我的意思是serialVersionUID)中所做的那样,并提供在类上映射xml的功能,即使在不同版本的情况下(例如,在XmlAdapter中添加关于存储在xml中的类的版本的信息) ).默认情况下,如果xml和运行时中的类版本不同 - 抛出InvalidClassException.
示例:我们的课程测试如下:
@XmlRootElement
@XmlAccessorType(value = XmlAccessType.FIELD)
public class Test {
private Long time;
private Test () {};
}
Run Code Online (Sandbox Code Playgroud)
假设时间是以毫秒为单位的UNIX时间.
此代码在生产时发布,此类作为xml保存在数据库中.下一个版本显示使用Long作为时间表示并且它已更改为Date不是一个好选择:
@XmlRootElement
@XmlAccessorType(value = XmlAccessType.FIELD)
public class Test {
private Date time;
private Test () {};
}
Run Code Online (Sandbox Code Playgroud)
现在有两种方法 - 迁移持久化数据或编写将处理长时间并将其应用于日期时间的xml适配器.
如果我们选择第二种方式,那么如果JAXB API提供存储在xml中的类版本(假设在class = 0版本中没有指定类版本)并且我们显式添加新版本的类(通过注释或静态)领域):
@XmlRootElement
@XmlAccessorType(value = XmlAccessType.FIELD)
@XmlClassVersion(value = 1)
public class Test {
private Date time;
private Test () {};
}
Run Code Online (Sandbox Code Playgroud)
要么
@XmlRootElement
@XmlAccessorType(value = XmlAccessType.FIELD)
public class Test {
private static …Run Code Online (Sandbox Code Playgroud) 我有未知结构的XML,我想在它上面应用ST(简单转换),以"某种方式"将XML中的内容转换为ABAP结构.
现在我有以下测试报告:
report ztbu_st_with_copy.
data: lf_xml type string.
concatenate '<tab><obj>'
'<id>A1</id>'
'<first>Erste</first>'
'<second>Zweite</second>'
'</obj><obj>'
'<id>B2</id>'
'<item>'
'<here>Tady</here>'
'<there>Tam</there>'
'</item>'
'</obj>'
'</tab>'
into lf_xml.
types: begin of ys_obj,
id type string,
rest type string,
end of ys_obj,
yt_obj type standard table of ys_obj.
data: lt_obj type yt_obj.
call transformation ztbu_st_copy_test
source xml lf_xml
result root = lt_obj.
uline.
data: ls_obj like line of lt_obj.
loop at lt_obj into ls_obj.
write: / sy-tabix, ls_obj-id.
endloop.
uline.
Run Code Online (Sandbox Code Playgroud)
我跟随ST转换ZTBU_ST_COPY_TEST(上面调用的那个):
<?sap.transform simple?>
<tt:transform xmlns:tt="http://www.sap.com/transformation-templates">
<tt:root …Run Code Online (Sandbox Code Playgroud) 我被要求从http端点提供以下XML文档,如下所示: -
<?xml version="1.0" encoding="utf-8"?>
<XMLFile xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<SalesOrders>
...
</SalesOrders>
Run Code Online (Sandbox Code Playgroud)
但Web API会吐出来
<?xml version="1.0" encoding="utf-8"?>
<XMLFile xmlns:i="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://schemas.datacontract.org/2004/07/White.Label.Ordering.Infrastructure.Data.Queries.Export">
<SalesOrders>
...
</SalesOrders>
Run Code Online (Sandbox Code Playgroud)
我有谷歌并尝试各种修复,但无济于事,我的模型看起来像
[DataContract]
public class XMLFile
{
[DataMember]
public List<SalesOrder> SalesOrders { get; set; }
}
[DataContract]
public class SalesOrder
{
[DataMember(Order = 1)]
public string OrderNumber { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我的设置就像这样
public static void Register(HttpConfiguration config)
{
config.Formatters.XmlFormatter.WriterSettings.OmitXmlDeclaration = false;
...
}
Run Code Online (Sandbox Code Playgroud)
如何做我删除xmlns:i,并xmlns与更换xmlns:xsd和xmlns:xsi?
我知道这是一个不好的问题,因为它应该没关系,但我的消费客户正在bar.
我使用asp.net(C#)的网站,我想Deserialize在XML字符串中使用XmlSerializer类。
我的模型(.cs文件)
[XmlRoot("MedicalClearanceFormRoot")]
public class MedicalClearanceViewModel
{
[XmlAttribute("PassengerName")]
public string PassengerName { get; set; }
[XmlAttribute("Gender")]
public string Gender { get; set; }
[XmlAttribute("Age")]
public string Age { get; set; }
[XmlAttribute("PhoneNo")]
public string PhoneNo { get; set; }
[XmlAttribute("Email")]
public string Email { get; set; }
[XmlAttribute("BookingRefNo")]
public string BookingRefNo { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
XML字串
<MedicalClearanceFormRoot>
<MedicalClearanceForm PassengerName="AAAAAAAAAAAAA" Age="11" PhoneNo="TTTTTTTTTTT" Email="ZZZZZZZZZZZZZZZZZZZ" BookingRefNo="11111111111111111111" />
</MedicalClearanceFormRoot>
Run Code Online (Sandbox Code Playgroud)
将XML反序列化为对象的代码
string myXMLStringFromDB = GetXMLStringFromDb(); // this method …Run Code Online (Sandbox Code Playgroud)