有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

xml Java获取节点的标记名

我需要读取一个小xml文件,并根据一个硬编码的HashMap验证其内容,其中key=tag和value=text位于标记内。 我无法获取节点的标记名。 如果将节点转换为元素,则会出现强制转换异常

我正在使用末日课程阅读:

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

        NodeList list = doc.getElementsByTagName("MergeOptions");
        if (list.getLength() == 0)
        {
        //throw
        }
        NodeList config = list.item(0).getChildNodes();
        for (int i = 0; i <= config.getLength() - 1; i++)
        {

            Node setting = config.item(i);
            String nodeName = setting.getNodeValue();
            String value = setting.getTextContent();
            if (defaultMergeOptions.containsKey(nodeName) == false)
            {
                    //throw
            }

            if (defaultMergeOptions.get(nodeName).equals(value))
            {
                    //throw
            }

Xml文件:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  <MergeOptions>
   <sometagName>false</sometagName>
 </MergeOptions>

共 (3) 个答案

  1. # 1 楼答案

    我做了一些不同的事情

    似乎有效:

    IntegrationTest.getInstance().getLogger().log(Level.INFO, "Reading merge-que file: " + xmlFile.getAbsolutePath());
        try
        {
            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
            Document doc = dBuilder.parse(xmlFile);
    
            for (Entry<String, String> entry : defaultMergeOptions.entrySet())
            {
                String tagName = entry.getKey();
    
                NodeList list = doc.getElementsByTagName(tagName);
                if (list.getLength() != 1)
                {
                    IntegrationTest.getInstance().getLogger().log(Level.SEVERE, TestResult.FAIL, "Merge option [{0}] has invalid content. Tag [{1}] missing or to many",
                            new Object[] { xmlFile.getName(), tagName });
                    result = TestResult.FAIL;
                    continue;
                }
    
                if (!defaultMergeOptions.get(tagName).equals(list.item(0).getTextContent()))
                {
                    IntegrationTest.getInstance().getLogger().log(Level.WARNING, TestResult.FAIL, "Merge option [{0}] has diffrent content for tag [{1}].",
                            new Object[] { xmlFile.getCanonicalPath(), tagName });
                    result = TestResult.FAIL;
                }
    
            }
    
    
    
        }
        catch (Exception e)
        {
            IntegrationTest.getInstance().getLogger().log(Level.SEVERE, SBUtil.stackTraceToString(e.getStackTrace()));
            throw new IntegrationTestException(e);
    
        }
    }
    
  2. # 2 楼答案

    我已经试过运行你的代码,它运行得很好,没有类强制转换异常。 请注意我是如何在for循环中使用元素来获取可能的子元素的名称、值或存在性的

    final String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" +
                "<MergeOptions>\n<sometagName>false</sometagName>\n</MergeOptions>";
    
    final InputStream xsmlStream = new ByteArrayInputStream(xml.getBytes());
    
    final DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
    final DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
    final Document doc = dBuilder.parse(xsmlStream);
    
    final NodeList nodes = doc.getElementsByTagName("MergeOptions");
    
    for (int i = 0; i < nodes.getLength(); i++) {
        final Element element = (Element) nodes.item(i);
        System.out.println(element.hasChildNodes());
        System.out.println(element.getNodeValue());
        System.out.println(element.getTagName());
    }
    

    使用哈希映射将节点名称作为键有点棘手,因为如果XML文件有多个具有相同名称和不同值的节点名称,哈希映射将只存储一个唯一键,从而只验证一个同名节点。其他名称相同但值不同的节点将无效

  3. # 3 楼答案

    我正在帮助您完成以下代码结构。一旦看到标记名和值,就可以应用逻辑从HashMap键或值进行比较

    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    
    import org.w3c.dom.Document;
    import org.w3c.dom.Element;
    import org.w3c.dom.Node;
    import org.w3c.dom.NodeList;
    
    public class Test1 {
        public static void main(String[] args) throws Exception {
            String xmlFile = "test.xml";
            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
            Document doc = dBuilder.parse(xmlFile);
            Element root = doc.getDocumentElement();
            System.out.println(root.getNodeName());
    
            NodeList list = root.getChildNodes();
    
            for (int i = 0; i < list.getLength(); i++) {
                Node node = list.item(i);
                if (node.getNodeType() == Node.ELEMENT_NODE)
                 {
                    System.out.println(node.getNodeName() + " : " + node.getTextContent());
                 }
            }
    
        }
    }