2

Apache XMLBeans を使用して、String をエスケープして 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);
  }
}
4

3 に答える 3

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);
于 2012-03-29T18:17:40.413 に答える
0

予想される文字列が正しくありません。xmlText を呼び出すと、XML が返されるため、文字列を xml-fragment 要素でラップする必要があります。

于 2014-12-12T17:29:45.040 に答える
0

通常のxml文字列としてxmlリーダーを作成し、xml-fragmentを削除します。私はこのように試しました。

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);
于 2016-03-22T17:19:30.360 に答える