【问题标题】:Encoding XML entities in string using Apache XMLBeans使用 Apache XMLBeans 在字符串中编码 XML 实体
【发布时间】:2023-03-18 18:01:02
【问题描述】:

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

XmlString 确实提供了此功能,但坚持将输出包装在 xml-fragment 标记中,我想摆脱它。

但是,我对建议不感兴趣

  • 使用除 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);
  }
}

【问题讨论】:

  • 如果 XmlBeans 没有自动转义必须转义的内容,我会感到非常惊讶。为什么要手动逃跑?
  • JB Nizet:我正在使用 XMLBeans 来实现自定义 XML 编组框架的一部分。我并不是要暗示 XmlBeans 不会自动转义必须转义的内容。
  • 你为什么不能使用例如字符串逃逸工具?这可能会揭示一些不清楚的要求。
  • Ed:我确实可以使用 StringEscapeUtils,这就是我目前正在使用的。但是鉴于所需的功能已经在 XMLBeans 中,我想摆脱 Commons Lang 依赖。

标签: java xml escaping xmlbeans


【解决方案1】:

在将 XmlOptions 传递给 xmlText() 方法之前使用 setSaveOuter() 选项。像这样。

XmlOptions opts = new XmlOptions();
opts.setSaveOuter();
return value.xmlText(opts);

我想澄清一下,如果你只是凭空创建一个新元素,似乎元素名称不会被序列化。例如,如果我有一个带有 Property 元素的 Model 元素,则以下内容不会显示属性标签,而是显示 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);

【讨论】:

  • 我试过了,但是这不起作用。我什至试过this link。任何帮助表示赞赏。
  • +1 在这个答案上,对我有用 - 不知道为什么它对你不起作用 dileepvikram - 我只是在创建 JMS TextMessage 对象 XmlOptions opts = new XmlOptions(); opts.setSaveOuter(); 之前添加了这个,然后添加了“选择”在这里:sendMessage(_OrderStateChangeEventTypeImpl.xmlText(opts)); 它就像一个魅力
【解决方案2】:

您预期的字符串不正确。由于调用 xmlText,它将返回一个 XML,因此字符串必须包装在 xml-fragment 元素中。

【讨论】:

  • 考虑用相关代码支持你的答案。
【解决方案3】:

将 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);
}

然后

JAXBContext jaxbContext = JAXBContext.newInstance(YourClass.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
StringReader reader = new StringReader(request);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-20
    • 1970-01-01
    相关资源
    最近更新 更多