Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用ApacheXMLBeans以字符串形式编码XML实体_Java_Xml_Escaping_Xmlbeans - Fatal编程技术网

Java 使用ApacheXMLBeans以字符串形式编码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

我想使用ApacheXMLBeans对字符串进行转义,以便将其嵌入到XML文档中,例如,对所有XML实体进行编码

XmlString确实提供了这个功能,但坚持用xml片段标记包装输出,我想去掉它

然而,我对建议不感兴趣

  • 使用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 &amp; me]> 
    //             but was:<[<xml-fragment>You &amp; 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);