用Java解析XSI

时间:2011-11-11 19:17:57

标签: java xml

我正在尝试将XML字符串解析为可用于轻松搜索的文档。但是,当我遇到某些类型的XML时,它似乎不起作用。永远不会构造文档,并且当它遇到像我在底部的XML消息时为空。我的try / catch

中的任何内容都不会引发重复操作

我的代码目前看起来像这样:

Document convertMessageToDoc(String message){
        Document doc = null;

        try {
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            dbf.setNamespaceAware(true);
            DocumentBuilder db = dbf.newDocumentBuilder();
            InputSource is = new InputSource();
            is.setCharacterStream(new StringReader(message));

            doc = db.parse(is);
        }
        catch (Exception e) {
            //e.printStackTrace();
            doc = null;
        }

        return doc;
    }

我有什么方法可以使用这样的东西:

 <ns1:SubmitFNOLResponse xmlns:ns1="http://website.com/">
 <ns1:FNOLReporting xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns1:FNOLReporting">
 <ns1:FNOLResponse>
 <ns1:FNOLStatusInfo>
  <ns1:StatusCode>0</ns1:StatusCode> 
  <ns1:StatusMessages /> 
  </ns1:FNOLStatusInfo>
  </ns1:FNOLResponse>
  </ns1:FNOLReporting>
  </ns1:SubmitFNOLResponse>

2 个答案:

答案 0 :(得分:1)

看起来您的文档不是“格式良好”。您需要一个根元素,其中根目录中有两个兄弟“ns1:Prod”标记。

答案 1 :(得分:0)

您的文档格式不是格式良好的XML。一旦它出现,一切似乎都按预期工作。

String message =
        "<ns1:Prods xmlns:ns1='/foo'>"// xmlns:ns1='uri'>"
                + "<ns1:Prod>"
                + "  <ns1:ProductID>316</ns1:ProductID>"
                + "        <ns1:Name>Blade</ns1:Name>"
                + "</ns1:Prod>"
                + "<ns1:Prod>"
                + "  <ns1:ProductID>317</ns1:ProductID>"
                + " <ns1:Name>LL Crankarm</ns1:Name>"
                + "  <ns1:Color>Black</ns1:Color>"
                + "</ns1:Prod>"
                + "</ns1:Prods>";

Document doc = null;

try {
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    dbf.setNamespaceAware(true);
    dbf.setValidating(false);
    DocumentBuilder db = dbf.newDocumentBuilder();
    InputSource is = new InputSource();
    is.setCharacterStream(new StringReader(message));
    doc = db.parse(is);

    NodeList sections = doc.getElementsByTagName("ns1:Prod");
    int numSections = sections.getLength();
    for (int i = 0; i < numSections; i++) {
        Element section = (Element) sections.item(i);
        NodeList prodinfos = section.getChildNodes();
        for (int j = 0; j < prodinfos.getLength(); j++) {
            Node info = prodinfos.item(j);
            if (info.getNodeType() != Node.TEXT_NODE) {
                System.out.println(info.getNodeName() + ": " + info.getTextContent());
            }
        }
        System.out.println("");
    }
} catch (Exception e) {
    e.printStackTrace();
    doc = null;
}

// Outputs

ns1:ProductID: 316
ns1:Name: Blade

ns1:ProductID: 317
ns1:Name: LL Crankarm
ns1:Color: Black