Кодирование объектов XML в строку с использованием Apache XMLBeans - PullRequest
1 голос
/ 08 июля 2011

Я хотел бы использовать Apache XMLBeans для экранирования строки для встраивания ее в документ 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);
  }
}

Ответы [ 3 ]

1 голос
/ 29 марта 2012

Используйте параметр setSaveOuter () перед передачей XmlOptions методу xmlText ().Как это.

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

Я хотел бы уточнить, что если вы просто создаете новый элемент из воздуха, кажется, что имя элемента не будет сериализовано.Например, если у меня есть элемент Model, в котором есть элемент 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);
0 голосов
/ 22 марта 2016

создайте xml reader как обычную 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);
0 голосов
/ 12 декабря 2014

ваша ожидаемая строка неверна. благодаря вызову xmlText он будет возвращать XML, поэтому строка должна быть заключена в элемент xml-фрагмента.

...