0

xmlファイルの内容

<distributionChannels><distributionChannel type="Wap" id="1"><contentChannelRefs>
<contentChannelRef id="2"><categories><category 
link="http://images/11.gif" id="1"><names><name lang="de">Top Downloads</name><name
lang="ww">Tops</name></names></category></categories></contentChannelRef>
</contentChannelRefs></distributionChannel>  
</distributionChannels>

xmlファイルから読み取っている不要なコンテンツを削除するにはどうすればよいですか。出力は次のようになります。

<category link="http://images/11.gif" id="1"><names><name lang="de">Top Downloads</name><name lang="ww">Tops</name></names></category>
4

2 に答える 2

3

信頼できるソリューション-XMLパーサーを使用します。簡単な解決策は

s = s.substring(s.indexOf("<categories>"), s.indexOf("</categories>") + 13);

カテゴリを1つずつ読みたい場合は、正規表現を使用してください

    Matcher m = Pattern.compile("<category.*?>.*?</category>").matcher(xml);
    for(int i = 0; m.find(); i++) {
        System.out.println(m.group());
    }
于 2013-03-25T14:01:39.850 に答える
2

XMLとのパターンマッチングはお勧めしません。パーサーを使用してノードを取得し、それに応じて管理します。それらを印刷することに興味がある場合は、ノードを印刷するためのコードを含めました。

public static void main(String[] args)
        throws ParserConfigurationException, SAXException,
        IOException, XPathExpressionException {
    DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
    domFactory.setNamespaceAware(true);
    DocumentBuilder builder = domFactory.newDocumentBuilder();
    Document doc = builder.parse(new InputSource(new StringReader(s)));

    XPathFactory factory = XPathFactory.newInstance();
    XPath xpath = factory.newXPath();
    XPathExpression expr
            = xpath.compile("//categories//category");

    Object result = expr.evaluate(doc, XPathConstants.NODESET);
    NodeList nodes = (NodeList) result;
    //This is where you are printing things. You can handle differently if
    //you would like.
    for (int i = 0; i < nodes.getLength(); i++) {
        System.out.println(nodeToString(nodes.item(i)));
    }
}

private static String nodeToString(Node node) {
    StringWriter sw = new StringWriter();
    try {
        Transformer t = TransformerFactory.newInstance().newTransformer();
        t.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
        t.setOutputProperty(OutputKeys.INDENT, "yes");
        t.transform(new DOMSource(node), new StreamResult(sw));
    } catch (TransformerException te) {
        te.printStackTrace();
    }
    return sw.toString();
}
于 2013-03-25T15:02:59.590 に答える