如何在不使用java中的标记名称的情况下提取xml标记值?

时间:2012-09-04 00:51:47

标签: java xml tags extract

我正在使用java.I有一个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,即使我提供&lt; mailing>而不是<personal> tag.It不应该依赖于标签名称。

希望我不要混淆。我是使用xml.So的java新手,请原谅我,如果我的问题很愚蠢。 请帮助。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

由于您不知道自己的element名称,我建议您创建一个DOM树并对其进行迭代。当您获得element时,您会尝试将其与ruleset匹配(我会建议您使用regex为此目的)然后写它到你的文件。

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

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设计模式来设计规则集。