java - 解析的 XML 中缺少标记名称(根元素除外)

标签 java xml sax

我正在读取动态 XML 文件(没有任何已知结构)并将相关标签名称和值放入 HashMap (例如: 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}

除了根元素之外, map 中缺少标记名称。请帮忙!

最佳答案

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

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

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

关于java - 解析的 XML 中缺少标记名称(根元素除外),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47647610/

相关文章:

java - 使用 Java 和 Sax 解析某些 RSS 提要时遇到问题

java - 如果任务遇到异常,则会抑制其进一步执行。为什么?

java - LibGDX - 返回特定舞台坐标的所有 Actor

java - 合并现有的 Hibernate 模型对象时出现 UnsupportedOperationException?

java - Java 中的 XML 验证 : processContents ="lax" seems not to work correctly

java - 将正则表达式应用于 SAX 流

java - 创建目录的名称编码令人困惑

xml - 使用 TWebBrowser 在 Vista 上像 IE 一样查看 XML

c# - 尝试将具有空属性名称的 JSON 转换为 XML 时出现异常

java - 底部导航图标颜色更改