除根元素外,解析的XML中缺少标记名称

时间:2017-12-05 06:45:51

标签: java xml sax

我正在阅读动态XML文件(没有任何已知结构)并将相关的标记名称和值放入散列图(例如:metadata<tagName, Value>)。

我的问题是,我无法获取tagName,但它只添加了根tagName和整个xml的所有值。

我的XML是:

<?xml version="1.0" encoding="UTF-8"?>
            <form kwf="VARA">
                <sec1>
                    <docID>2d2c5bf209b79d8b1a1f840ce4ce4030e66a76d6</docID>
                    <qrCode>xx.jpg</qrCode>
                    <title>NOOO FORM NAME</title>
                    <ELO_VARAFNAME>NO</ELO_VARAFNAME>
                    <ELO_VARALNAME>NAME</ELO_VARALNAME>   
                    <ELO_VARAEMAIL>noname@gmail.com</ELO_VARAEMAIL>
                    <ELO_VARAORBEONDOCID>2d2c5bf209b79d8b1a1f840ce4ce4030e66a76d6</ELO_VARAORBEONDOCID>
                </sec1>
            </form>

我的代码是:

public static Map<String,String> getMetaDataFromOrbeonXML(File fXmlFile) throws SAXException, ParserConfigurationException, IOException
  {
    Map metaData = new HashMap();
    String formName="";
    String docID = "";
    try {

        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
        Document doc = dBuilder.parse(fXmlFile);

       doc.getDocumentElement().normalize();

       System.out.println("Root element :" +        doc.getDocumentElement().getNodeName());

        NodeList nList = doc.getElementsByTagName("form");

    for (int temp = 0; temp < nList.getLength(); temp++) {

        Node nNode = nList.item(temp);
        System.out.println("\nCurrent Element :" + nNode.getNodeName());

        if (nNode.getNodeType() == Node.ELEMENT_NODE) {
              Element eElement = (Element) nNode;

             docID = eElement.getElementsByTagName("docID").item(0).getTextContent();
                metaData.put("docID", docID);
                metaData.put("appName", APP_NAME);
                metaData.put(eElement.getTagName(), eElement.getTextContent());

                System.out.println("META DATA MAP: "+ metaData.toString());

        }
      }

    } catch (Exception e) {
        e.printStackTrace();
    }

      return metaData;
 }

输出结果是:

{form=                  2d2c5bf209b79d8b1a1f840ce4ce4030e66a76d6
                        xx.jpg
                        NOOO FORM NAME
                        NO
                        NAME   
                        noname@gmail.com
                        2d2c5bf209b79d8b1a1f840ce4ce4030e66a76d6

                , docID=2d2c5bf209b79d8b1a1f840ce4ce4030e66a76d6, appName=VIRGINAUSI, formName=AITSLForm}

除根元素外,地图中缺少标记名称。请帮忙!

1 个答案:

答案 0 :(得分:0)

上面的代码在地图中正确添加了2个条目。第一个条目将元素Form映射到它的文本内容(它是所有它的后代节点的文本内容的集合)。

如果您想访问后代节点,则需要使用eElement.getChildNodes()并迭代返回的NodeList

这可能有用: Java: Most efficient method to iterate over all elements in a org.w3c.dom.Document?