6

java xpathを使用して、xml要素を文字列としてIDで返す必要があります。

与えられた...

<svg>
    <g id="Background">
    </g>
    <g id="Outline">
        <polygon fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="round"     stroke-miterlimit="10" points=" 119.813,57.875 119.188,57.87" />
    </g>
    <g id="Base_Colour" transform="matrix(0.25 0 0 0.25 0 0)">
        <path fill="#ADB1AF" d="M112.25,208l-8,20.25l-0.5-1.75l0.75-0.5v-1.5l0.75-0.5v-1.5L106,222v-1.5l0.75-0.5v-1.5l0.75-0.5v-1.5"/>
        <path fill="#625595" d="M112.25,208l5.25-14.5l30-30.25l2.25-1.5l41.5-20.5l49.75-9.5h4.25l49,3l48.75"/>
    </g>
</svg>

返される値は..である必要があります。

<g id="Outline">
    <polygon fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="round"     stroke-miterlimit="10" points=" 119.813,57.875 119.188,57.87" />
</g> 

私は広範囲にグーグルで検索しましたが、私が試したことは何も要素全体を返すことができませんでした。任意のレベルのgタグをidでクエリしたいので、Xpathが必要です。

4

5 に答える 5

10

私が見つけた解決策は、xpathを使用してorg.w3c.dom.Nodeを取得することでした(DOMも機能します)。次に、ノードからjavax.xml.transform.dom.DOMSourceを作成し、それをjavax.xml.transform.TransformerFactoryを使用して文字列に変換しました。

Node node = // the node you want to serialize
xmlOutput = new StreamResult(new StringWriter());
transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
transformer.transform(new DOMSource(node), xmlOutput);
String nodeAsAString = xmlOutput.getWriter().toString();

これは、再利用のためにクラスに簡単に組み込まれます。残念ながら、.NETにあるように、Javaには.OuterXmlプロパティはありません。.NETerのすべてが今すぐに笑うことができます。

于 2012-12-19T22:18:20.797 に答える
1

xpathがXML構文を含む文字列を返すことはありません。

于 2012-12-19T01:27:24.767 に答える
0

私はこのコードで問題を解決しました:

public static String getOuterXml(Node node)
    throws TransformerConfigurationException, TransformerException {
    Transformer transformer = TransformerFactory.newInstance().newTransformer();
    transformer.setOutputProperty("omit-xml-declaration", "yes");

    StringWriter writer = new StringWriter();
    transformer.transform(new DOMSource(node), new StreamResult(writer));
    return writer.toString();         
}

クレジット:chick.Net

于 2017-06-14T19:03:01.433 に答える
0

Javaでxmlドキュメントなしでそれをしなければならない場合があります。そして私は以下のコードが非常に完全に使用されていることを発見しました

import java.io.IOException;
import java.io.StringReader;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

String responseMsg = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><YourMessage><MyTag>MyTagValue</MyTag></YourMessage>";
String expressionToExract = "/YourMessage/MyTag";
String xmlNodeWithData = xpathTester.getXmlNode(responseMsg, expressionToExract);
//above xmlNodeWithData will have this value '<MyTag>MyTagValue</MyTag>'

private String getXmlNode(String resultMsg, String expression)
        throws ParserConfigurationException, SAXException, IOException, XPathExpressionException {
    String xmlNodeWithData="";
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();
    InputSource is = null;
    StringReader sr = null;
    sr = new StringReader(resultMsg);
    is = new InputSource(sr);

    Document doc = builder.parse(is);
    XPathFactory xPathfactory = XPathFactory.newInstance();
    XPath xpath = xPathfactory.newXPath();
    XPathExpression expr = xpath.compile(expression);

    Node node = (Node)expr.evaluate(doc, XPathConstants.NODE);      
    xmlNodeWithData += "<" + node.getNodeName() + ">";
    NodeList nodeList = node.getChildNodes();

    for (int nodeIndex=0; nodeIndex < nodeList.getLength(); nodeIndex++) {
        Node nodeChild = nodeList.item(nodeIndex);          
        if (nodeChild.getNodeName().contains("#text")) {
            xmlNodeWithData += nodeChild.getTextContent();
            continue;
        }
        xmlNodeWithData += "<" + nodeChild.getNodeName() + ">";         
        xmlNodeWithData += nodeChild.getTextContent();
        xmlNodeWithData += "</" + nodeChild.getNodeName() + ">";
    }
    xmlNodeWithData += "</" + node.getNodeName() + ">";
    if (sr != null) {
        sr.close();
    }
    return xmlNodeWithData;
}
于 2019-02-26T22:02:17.460 に答える
-1

Javaについてはわかりませんが、.NETの世界では次のものを使用します

doc.DocumentElement.SelectSingleNode("/*/g[@id='Outline']").OuterXml
于 2012-12-19T05:38:22.070 に答える