1

Xpath を使用して XML コンテンツを解析しようとすると問題が発生します。Xml には名前空間情報が含まれます。NameSpaceContextImp (jdk の NameSpaceContext インターフェイスの apache WS commons 実装) を作成して、namaspace プレフィックスを URI にマップしようとしましたが、xml ドキュメントを正常にクエリできませんでした。http://chris.photobooks.com/xml/default.htmでオンラインの xpath テスト ツールを使用すると、使用する xpath クエリで予想されるノード/要素が表示されます。だから私は自分が間違っているのは何なのかを理解しようとしています。xml ドキュメントとサンプル コード スニペットを提供しています。フィードバックをいただければ幸いです。注として、名前空間プレフィックスを使用する場合と使用しない場合の両方で xpath クエリを試しました。

NamespaceContextImpl namespaceContext = new NamespaceContextImpl();
namespaceContext.startPrefixMapping("wsp", "http://schemas.xmlsoap.org/ws/2002/12/policy");
namespaceContext.startPrefixMapping("L7p", "http://www.layer7tech.com/ws/policy");
String policyXml = "xml content that is pasted below"
InputSource inputSource = new InputSource(new StringReader(policyXml));
XPathFactory xpathFactory = XPathFactory.newInstance();
XPath xPath = xpathFactory.newXPath();
xPath.setNamespaceContext(namespaceContext);
XPathExpression xpathExpression = xPath.compile("/wsp:Policy/wsp:All");
String evaluation = xpathExpression.evaluate(inputSource);
if (evaluation.trim().length() > 0) {
    System.out.println(evaluation);
}


    <?xml version="1.0" encoding="UTF-8"?>
<wsp:Policy xmlns:L7p="http://www.layer7tech.com/ws/policy" xmlns:wsp="http://schemas.xmlsoap.org/ws/2002/12/policy">
    <wsp:All wsp:Usage="Required">
        <L7p:SetVariable>
            <L7p:AssertionComment assertionComment="included">
                <L7p:Properties mapValue="included">
                    <L7p:entry>
                        <L7p:key stringValue="RIGHT.COMMENT"/>
                        <L7p:value stringValue="Used to enable message logging, Null (allow MSGDEBUG Header to set level), 0 - default,1 - Medium,2 - Full"/>
                    </L7p:entry>
                </L7p:Properties>
            </L7p:AssertionComment>
            <L7p:Base64Expression stringValue=""/>
            <L7p:VariableToSet stringValue="LOCAL_POLICY_DEBUG_LEVEL"/>
        </L7p:SetVariable>
        <L7p:Include>
            <L7p:PolicyGuid stringValue="ec1f4166-4299-4e44-bf9d-c5c2a9f0c894"/>
        </L7p:Include>
        <L7p:SslAssertion>
            <L7p:Option optionValue="Optional"/>
        </L7p:SslAssertion>
        <wsp:OneOrMore L7p:Enabled="false" wsp:Usage="Required">
            <L7p:SpecificUser>
                <L7p:Enabled booleanValue="false"/>
                <L7p:IdentityProviderOid longValue="-2"/>
                <L7p:UserLogin stringValue="test"/>
                <L7p:UserName stringValue="test"/>
                <L7p:UserUid stringValue="58916874"/>
            </L7p:SpecificUser>
            <L7p:SpecificUser>
                <L7p:Enabled booleanValue="false"/>
                <L7p:IdentityProviderOid longValue="-2"/>
                <L7p:UserLogin stringValue="test"/>
                <L7p:UserName stringValue="test"/>
                <L7p:UserUid stringValue="58916873"/>
            </L7p:SpecificUser>
            <L7p:SpecificUser>
                <L7p:Enabled booleanValue="false"/>
                <L7p:IdentityProviderOid longValue="-2"/>
                <L7p:UserLogin stringValue="test"/>
                <L7p:UserName stringValue="test"/>
                <L7p:UserUid stringValue="58916876"/>
            </L7p:SpecificUser>
            <L7p:SpecificUser>
                <L7p:Enabled booleanValue="false"/>
                <L7p:IdentityProviderOid longValue="-2"/>
                <L7p:UserLogin stringValue="test"/>
                <L7p:UserName stringValue="test"/>
                <L7p:UserUid stringValue="58916875"/>
            </L7p:SpecificUser>
            <L7p:SpecificUser>
                <L7p:Enabled booleanValue="false"/>
                <L7p:IdentityProviderOid longValue="-2"/>
                <L7p:UserLogin stringValue="testengineering-user"/>
                <L7p:UserName stringValue="testengineering-user"/>
                <L7p:UserUid stringValue="48201728"/>
            </L7p:SpecificUser>
        </wsp:OneOrMore>
        <wsp:OneOrMore wsp:Usage="Required">
            <L7p:HttpRoutingAssertion>
                <L7p:ProtectedServiceUrl stringValue="http://localhost:13000/Services/Finance/v1"/>
                <L7p:RequestHeaderRules httpPassthroughRuleSet="included">
                    <L7p:Rules httpPassthroughRules="included">
                        <L7p:item httpPassthroughRule="included">
                            <L7p:Name stringValue="Cookie"/>
                        </L7p:item>
                        <L7p:item httpPassthroughRule="included">
                            <L7p:Name stringValue="SOAPAction"/>
                        </L7p:item>
                    </L7p:Rules>
                </L7p:RequestHeaderRules>
                <L7p:RequestParamRules httpPassthroughRuleSet="included">
                    <L7p:ForwardAll booleanValue="true"/>
                    <L7p:Rules httpPassthroughRules="included"/>
                </L7p:RequestParamRules>
                <L7p:ResponseHeaderRules httpPassthroughRuleSet="included">
                    <L7p:Rules httpPassthroughRules="included">
                        <L7p:item httpPassthroughRule="included">
                            <L7p:Name stringValue="Set-Cookie"/>
                        </L7p:item>
                    </L7p:Rules>
                </L7p:ResponseHeaderRules>
            </L7p:HttpRoutingAssertion>
            <L7p:Include>
                <L7p:PolicyGuid stringValue="b438384e-eeb0-45c5-8a7e-d30da78f07ee"/>
            </L7p:Include>
        </wsp:OneOrMore>
    </wsp:All>
</wsp:Policy>
4

2 に答える 2

1

要素の下にある唯一のCDATAAllは空白であり、これをトリミングします。DOM要素を取得する場合は、NODEまたはNODESETNodeList)オプションを使用します。

String xml = "<foo><bar baz='hello' /></foo>";
InputSource src = new InputSource(new StringReader(xml));
XPathExpression expr = XPathFactory.newInstance().newXPath()
    .compile("/foo/bar");
Node node = (Node) expr.evaluate(src, XPathConstants.NODE);

Transformer trans = TransformerFactory.newInstance().newTransformer();
trans.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
trans.transform(new DOMSource(node), new StreamResult(System.out));
于 2012-06-05T20:41:47.043 に答える
0

引数を 1 つ指定して evaluate() を呼び出すと、結果の文字列への変換が要求されます。これは、要求されたノードの文字列値を取得することと同じです。つまり、選択した要素のテキスト ノードの子孫を連結したものです。すべての子孫テキスト ノードは空白であるため、何も返されません。

とりあえず、名前空間は問題ではありません。

于 2012-06-05T22:33:47.107 に答える