0

我正在使用 java。我有一个如下所示的 xml 文件:

<?xml version="1.0"?>
      <personaldetails>
          <phno>1553294232</phno>
          <email>
                <official>xya@gmail.com</official>
                <personal>bk@yahoo.com</personal>
          </email>
      </personaldetails>

现在,我需要使用特定条件检查每个标签值的类型,并将它们放在单独的文件中。

例如,在上面的文件中,我写了 10 位等于电话号码的条件,xxx@yy.com 格式的东西是电子邮件..

所以,我需要做的是我需要提取每个标签中的标签值,如果它匹配某个条件,则将其放入第一个文本文件中,如果不在第二个文本文件中。在这种情况下,第一个文本文件将包含:

1553294232
xya@gmail.com
bk@yahoo.com

以及第二个文件中的其余值。

我只是不知道如何在不使用标签名称的情况下提取标签值。(或不使用 GetElementsByTagName)。我的意思是这段代码应该提取电子邮件 bk@yahoo.com 即使我给出 <mailing>而不是<personal>标签。它不应该依赖于标签名称。

希望我不会感到困惑。我是使用 xml 的 Java 新手。所以,如果我的问题很愚蠢,请原谅我。请帮忙。

4

2 回答 2

2

似乎是XPath的典型用例

XPath 允许您以非常灵活的方式查询 XML。

本教程可以帮助:

http://www.javabeat.net/2009/03/how-to-query-xml-using-xpath/

如果您使用的是 Java脚本,可能是这种情况,因为您提到 getElementsByTagName(),您可以只使用 JQuery 选择器,它将为您提供跨浏览器的一致行为,并且 JQuery 库对许多其他事情很有用,如果您还没有使用它... http://api.jquery.com/category/selectors/

例如,以下是有关此的信息:

http://www.switchonthecode.com/tutorials/xml-parsing-with-jquery

于 2012-09-04T00:55:47.117 回答
1

由于您不知道自己的element名字,我建议您创建一DOM棵树并遍历它。当您获得 a 时element,您会尝试将其与您的ruleset我建议regex用于此目的)匹配,然后将其写入您的 a 文件。

这将是一个帮助您入门的示例结构,但您需要根据您的要求对其进行修改:

public void parseXML(){
    try{
        DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
        Document doc; 

        doc = documentBuilder.parse(new File("test.xml"));
        getData(null, doc.getDocumentElement());
    }catch(Exception exe){
        exe.printStackTrace();
    }
}

private void getData(Node parentNode, Node node){

    switch(node.getNodeType()){
        case Node.ELEMENT_NODE:{

            if(node.hasChildNodes()){
                NodeList list = node.getChildNodes();
                int size = list.getLength();

                for(int index = 0; index < size; index++){
                    getData(node, list.item(index));
                }
            }

            break;
        }

        case Node.TEXT_NODE:{
            String data = node.getNodeValue();

            if(data.trim().length() > 0){
                /*
                 * Here you need to check the data against your ruleset and perform your operation
                 */
                System.out.println(parentNode.getNodeName()+" :: "+node.getNodeValue());
            }
            break;
        }

    }
}

您可能想查看Chain of Responsibility设计模式来设计您的规则集。

于 2012-09-04T01:39:47.610 回答