2

XML Java ソリューションをプレーンな JaxB に置き換えたいマネージャーがいます。マーシャリングすると、XML は入ったようには見えず、(私の知る限り) XML に変更を加えていません。私は間違っている可能性があります。おそらく JAXBContext を正しく作成していませんが、現在は JaxB 自体が変更を行っているようです。

中心的な問題の 1 つは、JaxB が元のドキュメントから処理命令を取り除いていることです。処理命令は、当社のビジネスにとって非常に重要です。ドキュメントへのテキストの変更 (追加および削除されたもの) を追跡し、テキストの「セクション」の履歴 (全体が最初に作成された時期と場所) を記録するためにそれらを使用します。これらの処理命令は、プレーン テキストとノードを囲む、ドキュメントのさまざまなレベルにあります。この情報がなければ、ドキュメントはお客様にとって意味がありません。

アンマーシャリングおよびマーシャリング時に、これらの処理命令を元のドキュメントから保持する方法はありますか? マーシャリング中に処理命令を追加することについてスタックオーバーフローで話している人を見たことがありますが、元のドキュメントから既存の処理命令を保持する方法について回答があると思われる質問は見当たりません。XMLAdaptor と XMLStreamReader の使用を検討しましたが、行き止まりになりました。どちらも、PI を保持するのではなく、PI を追加することを目的としたソリューションのように見えます。しかし、おそらく私がそれらを間違って使用している可能性を排除することはできません.

public class JAXBParser {

  public static void main(String args[]) throws Exception {

    JAXBContext context = JAXBContext.newInstance(MeasureDocType.class);

    MeasureDocType mType = unmarshall("C:/Workspace/XCAMeasureParser -     JAXB/processPlace/2018/20170SB__004798AMD.xca", context);
    String measureText = marshal(context, mType);
    System.out.println(measureText);
  }

  public static MeasureDocType unmarshall (String anXmlFileName, JAXBContext context) throws Exception {

    XMLInputFactory xif = XMLInputFactory.newFactory();
    XMLStreamReader xsr = xif.createXMLStreamReader(new StreamSource(anXmlFileName));

    Unmarshaller unmarshaller = context.createUnmarshaller();
    JAXBElement<MeasureDocType> root = unmarshaller.unmarshal(xsr, MeasureDocType.class);

    return root.getValue();

  }

  public static String marshal(JAXBContext pContext, Object pObject) throws JAXBException {

    StringWriter sw = new StringWriter();

    Marshaller marshaller = pContext.createMarshaller();

    marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");

    if (pObject instanceof MeasureDocType) {
      MeasureDocType measureDocType = (MeasureDocType) pObject;
      ObjectFactory objectFactory = new ObjectFactory();
      JAXBElement<MeasureDocType> jaxElement = objectFactory.createMeasureDoc(measureDocType);
      marshaller.marshal(jaxElement, sw);
    }

    return sw.toString();
  }

}
4

0 に答える 0