假设我想在XML中存储许多小配置对象,我不太关心格式.内置到JDK中的XMLDecoder类可以工作,从我听到的,XStream以类似的方式工作.
每个图书馆有哪些优势?
我需要编写一个linux c ++应用程序,它以XML格式保存设置(便于手动编辑),并通过套接字和HTTP上的XML消息与现有应用程序通信.问题是我找不到任何智能库来帮助我,我并不特别喜欢编写DOM或SAX代码来编写和阅读一些非常简单的消息.
Boost Serialization几乎是匹配,但它为它生成的xml添加了许多特定于boost的数据.这显然不适用于交换格式.我想知道是否有可能使Boost Serialization或其他一些c ++序列化库生成干净的xml.我不介意是否有一些必需的额外属性 - 比如版本属性,但我真的希望能够控制他们的命名并摆脱我不使用的'功能' - tracking_level和class_id for实例.
理想情况下,我只想在Java中使用类似于xstream的东西.我知道c ++缺乏内省,因此有必要进行一些手动编码 - 但是如果有一个干净的解决方案来读取和编写简单的XML而没有kludges会很好!
如果无法做到这一点,我也对XML模式是规范资源(合同优先)的工具感兴趣 - 一个很好的JAXB替代C++.到目前为止,我只找到了像CodeSynthesis XSD这样的商业解决方案.我更喜欢开源解决方案.我尝试过gSoap - 但是它生成了非常丑陋的代码,并且它也是特定于SOAP的.
无奈之下,我也开始研究protobuffers的替代序列化格式.这存在 - 但仅限Java!令我惊讶的是,协议缓冲区似乎是比XML更好的支持数据交换格式.
我很生气只为这个应用程序找到libs,我真的需要一些新的想法.任何人?
c++ xstream xml-serialization codesynthesis boost-serialization
我知道由于安全原因,xstream在Google应用引擎上存在问题.我观察到应用了一些补丁来使它适用于xstream的gae.任何人都可以使用jar的版本,或者除了Je中的JAXP之外还有其他方法可以将xml制作成java吗?
我想格式化Xstream生成的输出XML,使其更具可读性.目前,在每个元素之后添加换行符,但我希望在每个属性之后添加换行符.有没有办法做到这一点?
默认情况下,使用Pretty Print Writer来格式化xml的输出,但这对我来说还不够.我想在每次之后添加换行符
在我收到的XML流中,我有以下声明
<user>
<age/>
</user>
Run Code Online (Sandbox Code Playgroud)
要插入到如下所示的对象中:
@XStreamAlias("user")
public class User {
public int age = 0;
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,每次尝试读取此XML时都会收到XStream异常,因为age xml标记为空:
Exception in thread "main" com.thoughtworks.xstream.converters.ConversionException: For input string: "" : For input string: ""
---- Debugging information ----
message : For input string: ""
cause-exception : java.lang.NumberFormatException
cause-message : For input string: ""
class : java.lang.Integer
required-type : java.lang.Integer
converter-type : com.thoughtworks.xstream.converters.SingleValueConverterWrapper
wrapped-converter : com.thoughtworks.xstream.converters.basic.IntConverter
path : /GoodreadsResponse/user/age
line number : 17
class[1] : fr.riduidel.exporter.goodreads.User
converter-type[1] : com.thoughtworks.xstream.converters.reflection.ReflectionConverter
class[2] : fr.riduidel.exporter.goodreads.GoodreadsResponse
version …Run Code Online (Sandbox Code Playgroud) 我的bean有对象,可以包含不同的类型.现在,当我创建XML时,它会将class属性添加到序列化对象.我想改变它的例子类简单名称.
示例Java:
public class MyParentClass {
private Object childObjectAttribute; // Can be any instance of any interface ...
// Getters & setters etc..
Run Code Online (Sandbox Code Playgroud)
XStream初始化:
public XStream getXStream()
{
XStream xstream = new XStream();
Class<?>[] c = { MyInterfaceImpl.class }; // MyInterfaceImpl has of course @XStreamAlias("MyInterface")
xstream.processAnnotations(c);
xstream.alias(MyInterface.class.getSimpleName(), MyInterface.class, MyInterfaceImpl.class);
return xstream;
}
Run Code Online (Sandbox Code Playgroud)
示例XML:
<myParentClass>
<childObjectAttribute class="com.example.PossibleClass"/>
</myParentClass>
Run Code Online (Sandbox Code Playgroud)
我想将com.example.PossibleClass更改为PossibleClass或其他内容.那可能吗?
我想以下列格式创建一个xml
<parm-list>
<param>
<NAME>somename</NAME>
<VALUE>somevalue</VALUE>
</param>
<param>
<NAME>somename</NAME>
<VALUE>somevalue</VALUE>
</param>
<param>
<NAME>somename</NAME>
<VALUE>somevalue</VALUE>
</param>
<param>
<NAME>somename</NAME>
<VALUE>somevalue</VALUE>
</param>
</param-list>
Run Code Online (Sandbox Code Playgroud)
如果我不想要<PARAM>具有特定字段的字段, 我该怎么办<NAME>?
假设我有一个xml文件应该如下所示:
<list>
<item>
<id>123</id>
<name>someName</name>
</item>
<item>
<id>234</id>
<name>anotherName</name>
</item>
<item>
<id>345</id>
<name>aThirdName</name>
</item>
</list>
Run Code Online (Sandbox Code Playgroud)
我使用XStream和以下类解析它:
class ListXML {
public List<ItemXML> list;
}
class ItemXML {
public String id;
public String name;
}
Run Code Online (Sandbox Code Playgroud)
和以下代码:
XStream xstream = new XStream(new DomDriver());
xstream.alias("list", ListXML.class);
xstream.alias("item", ItemXML.class);
xstream.addImplicitCollection(ListXML.class, "item");
ListXML result = (ListXML) xstream.fromXML(in);
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.但是,我现在遇到了一个案例,我将以下xml作为输入:
<list>
<item>
<id>123</id>
<name>someName</name>
</item>
<item>
<id>234</id>
<aTagUnknownToMe>blabla</aTagUnknownToMe>
</item>
<item>
<id>345</id>
<name>aThirdName</name>
</item>
</list>
Run Code Online (Sandbox Code Playgroud)
有没有办法将我的代码更改为"更强大",所以我可以在不知道"aTagUnknownToMe"标签的情况下获取id为123和345的项目?
我正在使用XStream,并且有一个类如下的字段:
private Map<String, String> data;
Run Code Online (Sandbox Code Playgroud)
我想生成这样的XML输出:
<key1>test data</key1>
<key2>test data</key2>
<key3>test data</key3>
Run Code Online (Sandbox Code Playgroud)
所以我希望map键成为元素.mapvalue是XML值,我不希望XML包含在诸如的元素中<data></data>.任何人都可以指向执行此操作的示例代码或类似的东西吗?
UPDATE
这只是一个片段,有一个根元素.
更新2
我发布的自定义转换器代码几乎可以使用.我得到一个扁平的结构,但我需要删除外部元素.有什么想法吗?
//this is the result need to remove <data>
<data>
<key1>test data</key1>
<key2>test data</key2>
<key3>test data</key3>
</data>
Run Code Online (Sandbox Code Playgroud)
这是代码
public class MapToFlatConverter implements Converter{
public MapToFlatConverter() {
}
@Override
public boolean canConvert(Class type) {
return Map.class.isAssignableFrom(type);
}
@Override
public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {
Map<String, String> map = (Map<String, String>) source;
for (Map.Entry<String, String> entry : map.entrySet()) {
writer.startNode(entry.getKey());
writer.setValue(entry.getValue().toString()); …Run Code Online (Sandbox Code Playgroud) 当使用带弹簧批的XStreamMarshaller时,我收到以下消息:
Security framework of XStream not initialized, XStream is probably vulnerable.
Run Code Online (Sandbox Code Playgroud)
首先尝试:根据文档,我试图重置所有权限,但我仍然有相同的消息.此外,在解析XML文件时我没有安全性错误...所以我认为这段代码不起作用.这是一个代码示例:
XStreamMarshaller marshaller = new XStreamMarshaller();
marshaller.getXStream().addPermission(NoTypePermission.NONE);
Run Code Online (Sandbox Code Playgroud)
第二次尝试:我也尝试过该setSupportedClasses方法,但它也不起作用(我仍然得到漏洞消息,并且不支持的类仍然无法正确排除):
XStreamMarshaller marshaller = new XStreamMarshaller();
marshaller.setSupportedClasses(FooBar.class);
Run Code Online (Sandbox Code Playgroud)
如何使用XStreamMarshaller设置安全权限?
注意:根据这个帖子,安全框架是在1.4.7中引入的,它仍然不是强制性的......但它对XStream 1.5.0是强制性的!
使用的XStream版本:1.4.10
使用的Spring Batch版本:4.0.1
有关信息,我使用的是Spring Boot(但我不确定它是否与此相关)