2

私たちのプロジェクトに固有の SOAP クライアントとパーサーを開発しようとしています。私はすでにクライアントを完成させており、多くの種類の (いくつかの異なる) SOAP Web サービスを呼び出し、XML 形式で応答 SOAP メッセージを取得しています。

私の目標:

任意のタイプのコレクションから任意のノードまたは属性の値を取得すると、すべての Web サービス応答に対して機能するはずです。

たとえば、次のように呼び出します。

String h1 = collection.get("html/body/h1");

h1 の値は 'StackOverflow' で、次の値から取得する必要があります。

<html>
  <head></head>
  <body>
    <h1>StackOverflow</h1>
    <p>XML parsing in Java</p>
  </body>
</html>

私のアプローチ:

今、私は応答メッセージを持っています。それを解析し、すべてのノード (および属性) の値をコレクション (マップ) に割り当て、そのコレクションからデータを取得したいと考えています。コレクションの (Map )キーはノードのパスになり、はノードまたは属性の値になります。

例えば

<MethodResponse xmlns="any.xmlns">
    <MethodResult>any value</MethodResult>
    <Node1>
        <Node2>
            <Node3>
                node3 value is here
            <Node3>
        </Node2>
    </Node1>
    <respCode>99</respCode>
    <respNote>any value</respNote>
</MethodResponse>

ここで respCode が必要な場合は、次の方法で呼び出すことができます。

String respCode = map.get("/MethodResponse/respCode");

または、Node3 に対して:

String node3Value = map.get("/MethodResponse/Node1/Node2/Node3");

XPathのように。しかし、マッピングやJavaクラスは必要ありません。そのパスからノード (または属性) の値にアクセスしたいだけです。

成功基準:

これらおよびいくつかの異なる SOAP メッセージに対して機能します。

そして私の質問:

  1. 私のアプローチは正しいですか?
  2. はいの場合、どうすればそれを行うことができますか? 動作するコードやチュートリアルはありますか?
  3. いいえの場合、どうすればそれを行うことができますか?
4

1 に答える 1

1

Java DOM XML パーサーの作成は、javax.xml.parsers.DocumentBuilderFactory クラスを使用して行われます。次に例を示します。

DocumentBuilderFactory builderFactory =
        DocumentBuilderFactory.newInstance();
DocumentBuilder builder = null;
try {
    builder = builderFactory.newDocumentBuilder();
} catch (ParserConfigurationException e) {
    e.printStackTrace();  
}

DocumentBuilder を使用して XML ファイルを DOM ツリーに解析するには、次のようにします。

try {
    Document document = builder.parse(
            new FileInputStream("data\\text.xml"));
} catch (SAXException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}

一番上にあるのは Document オブジェクトです。Document オブジェクトには単一のルート要素があり、次のように getDocumentElement() を呼び出すことによって返されます。

Element rootElement = document.getDocumentElement();

要素の子を取得する

NodeList nodes = element.getChildNodes();

for(int i=0; i<nodes.getLength(); i++){
  Node node = nodes.item(i);

  if(node instanceof Element){
    //a child element to process
    Element child = (Element) node;
    String attribute = child.getAttribute("width");
  }
}

これで、必要なノードができたので、必要に応じて作成してマップに配置し、必要なキーを作成できます。methodTransformer.transform(new DOMSource(document),任意の Dom ノードまたは要素で動作

ドキュメントから文字列を作成

TransformerFactory transFactory = TransformerFactory.newInstance();
Transformer transformer = transFactory.newTransformer();
StringWriter buffer = new StringWriter();
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
transformer.transform(new DOMSource(document),
      new StreamResult(buffer));
String str = buffer.toString();
于 2013-10-11T12:15:41.247 に答える