0

xml要素を持つ要素をチェックしていますが、存在しない場合はデフォルト値になります。

これは、Websphere7上のJAXWSへのWebサービス呼び出しからorg.apache.xerces.dom.ElementNSImplとして送信されます。

// instantiate xpath
XPathFactory xPathFactory = XPathFactory.newInstance();
XPath xPath = xPathFactory.newXPath();
xPath.setNamespaceContext(new NamespaceContext() {
    public String getNamespaceURI(String prefix) {
    if ("ns".equals(prefix))
        return PROVIDER_NAMESPACE;
    else
        return XMLConstants.NULL_NS_URI;
    }
    public String getPrefix(String uri) {
        return null; // n/a
    }
    public Iterator<?> getPrefixes(String uri) {
        return null; // n/a
    }
});

// Check if date is populated
XPathExpression declarationDateXpath = xPath.compile("//ns:Provider/ns:DeclarationDate");
Node dateNode = (Node) providerDateXpath.evaluate(node, XPathConstants.NODE);
if (dateNode == null) {
    // if not there, add the node
    Document doc = node.getOwnerDocument();
    dateNode = doc.createElementNS(PROVIDER_NAMESPACE, "DeclarationDate");

    XPathExpression providerXPath = xPath.compile("//ns:Provider");    
    Node providerNode = (Node) providerXPath.evaluate(node, XPathConstants.NODE);
    providerNode.appendChild(dateNode);
}

// Check value & set default if necessary
if (dateNode.getTextContent() == null || "".equals(dateNode.getTextContent())) {
    // date not set, defaulting to today
    dateNode.setTextContent(today);
} 

ご覧のとおり、私はそれぞれの呼び出しで可能な限りすべてをインスタンス化しています。

最初のWebサービス呼び出しは、ノードを返すように機能します。2番目のWebサービス呼び出しでは、両方のxpathに対してnullを返します。

javadocによると、 「XPath[およびXPathExpression][オブジェクトは]スレッドセーフではなく、再入可能でもありません。

何か案は?

4

1 に答える 1

0

まぁ、いいよ。私はそれを機能させたことがわかりました。

それはxpathでした。正確には、 2回目のxpathでした。

xpathを"//ns:Provider/ns:DeclarationDate"ns:Providerルートはどこですか)からに短縮しました"//ns:DeclarationDate"

これを引き起こしているJAXPのWebSphere7実装のどこかに欠陥がありますが、さらに調査することは不可能/価値がありません。

これが将来誰かに役立つことを願っています...

于 2011-08-31T23:29:31.057 に答える