2013-03-25 52 views
0

XML文件内容前,在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> 

回答

3

可靠的解决方案 - 使用XML解析器。如果你想读的类别逐一使用正则表达式

Matcher m = Pattern.compile("<category.*?>.*?</category>").matcher(xml); 
    for(int i = 0; m.find(); i++) { 
     System.out.println(m.group()); 
    } 
+0

感谢dorofeev,如果我有多个在相同的字符串我如何解决... – srp 2013-03-25 14:19:50

+0

好吧,看到更新后的版本 – 2013-03-25 14:34:21

+0

谢谢你,我的意思是我想提取仅,可以说如果我有100个,我正在写50到第一个文件和下一个50到第二个文件。 – srp 2013-03-25 14:39:40

2

模式与XML的匹配,不建议简单的办法就是

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

。使用解析器来获取节点并相应地管理它们。如果你有兴趣打印它们,我已经包含了打印节点的代码。

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(); 
}