Java 使用ApacheXMLBeans以字符串形式编码XML实体
我想使用ApacheXMLBeans对字符串进行转义,以便将其嵌入到XML文档中,例如,对所有XML实体进行编码 XmlString确实提供了这个功能,但坚持用xml片段标记包装输出,我想去掉它 然而,我对建议不感兴趣Java 使用ApacheXMLBeans以字符串形式编码XML实体,java,xml,escaping,xmlbeans,Java,Xml,Escaping,Xmlbeans,我想使用ApacheXMLBeans对字符串进行转义,以便将其嵌入到XML文档中,例如,对所有XML实体进行编码 XmlString确实提供了这个功能,但坚持用xml片段标记包装输出,我想去掉它 然而,我对建议不感兴趣 使用XMLBeans以外的任何东西(如org.apache.commons.lang.StringEscapeUtils) 转义后移除封闭标签(例如,使用正则表达式) 这是一个测试用例。你能帮我修一下吗 import org.apache.xmlbeans.*; publi
- 使用XMLBeans以外的任何东西(如org.apache.commons.lang.StringEscapeUtils)
- 转义后移除封闭标签(例如,使用正则表达式)
import org.apache.xmlbeans.*;
public class Test {
@Test public void test(){
String input = "You & me";
String expected = "You & me";
String actual = escape(input);
Assert.assertEquals(expected, actual);
// Fails with: ComparisonFailure: expected:<[You & me]>
// but was:<[<xml-fragment>You & me</xml-fragment>]>
}
private String escape(String str){
XmlString value = XmlString.Factory.newInstance();
value.setStringValue(input);
XmlOptions opts = new XmlOptions();
// do I need to set one of the 54 available options?
// see http://xmlbeans.apache.org/docs/2.4.0/reference/org/apache/xmlbeans/XmlOptions.html
return value.xmlText(opts);
}
}
import org.apache.xmlbeans.*;
公开课考试{
@测试公共无效测试(){
字符串输入=“你和我”;
字符串expected=“You&;me”;
字符串实际值=转义(输入);
Assert.assertEquals(预期、实际);
//失败原因:比较失败:应为:
//但是:
}
私有字符串转义(字符串str){
XmlString value=XmlString.Factory.newInstance();
值。设置字符串值(输入);
XmlOptions opts=新的XmlOptions();
//我需要设置54个可用选项中的一个吗?
//看http://xmlbeans.apache.org/docs/2.4.0/reference/org/apache/xmlbeans/XmlOptions.html
返回值.xmlText(opts);
}
}
在将XmlOptions传递给xmlText()方法之前,请使用setSaveOuter()选项。像这样
XmlOptions opts = new XmlOptions();
opts.setSaveOuter();
return value.xmlText(opts);
我想澄清一下,如果您只是凭空创建一个新元素,那么元素名似乎不会被序列化。例如,如果我有一个模型元素,上面有一个Property元素,那么下面的内容将不会显示Property标记,而是显示xml片段
Property property = Property.Factory.newInstance();
XmlOptions opts = new XmlOptions();
opts.setSaveOuter();
return property.xmlText(opts);
要显示属性元素,我必须执行以下操作
ModelDocument modelDoc = ModelDocument.Factory.newInstance();
ModelType model = modelDoc.addNewModel();
PropertyType propertyType = model.addNewProperty();
Property property = Property.Factory.newInstance();
XmlOptions opts = new XmlOptions();
opts.setSaveOuter();
return property.xmlText(opts);
您期望的字符串不正确。通过调用xmlText,它将返回一个XML,因此字符串必须包装在XML片段元素中 将xml读取器创建为普通xml字符串,然后删除xml片段, 我试过这样做
if(request != null && request.contains("<xml")){
XMLInputFactory xif = XMLInputFactory.newFactory();
StringReader reader = new StringReader(request);
StreamSource xml = new StreamSource(reader);
XMLStreamReader xsr = xif.createXMLStreamReader(xml);
xsr.nextTag();
request = xsr.getElementText();
System.out.println("updated request is \n"+request);
}
如果XmlBeans没有自动逃逸必须逃逸的内容,我会非常惊讶。为什么要手动转义?JB Nizet:我正在使用XMLBeans实现自定义XML封送框架的一部分。我不是想暗示XmlBeans不会自动转义必须转义的内容。为什么不能使用例如StringEscapeUtils?艾德:我确实可以使用StringEscapeUtils,这就是我目前正在使用的。但是考虑到所需的功能已经存在于XMLBeans中,我想摆脱Commons Lang依赖关系。我已经尝试过了,但这不起作用。我甚至尝试过。感谢您的帮助。+1关于这个答案,对我有用-不知道为什么它对您不起作用dileepvikram-我只是在创建JMS TextMessage对象
XmlOptions opts=new XmlOptions()之前添加了这个代码>opts.setSaveOuter()
然后在这里添加了“opts:sendMessage(_OrderStateChangeEventTypeImpl.xmlText(opts))代码>它就像一个charmConsider,用相关代码支持您的答案。
JAXBContext jaxbContext = JAXBContext.newInstance(YourClass.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
StringReader reader = new StringReader(request);