JDOM Parser和Namespace如何获得干净的内容

时间:2012-10-04 15:13:35

标签: xml jdom

MY xml:

<?xml version="1.0"?>
<company xmlns="http://www.xx.com/xx">
    <staff>
        <firstname>yong</firstname>
        <lastname>mook kim</lastname>
        <nickname>mkyong</nickname>
        <salary>100000</salary>
    </staff>
    <staff>
        <firstname>low</firstname>
        <lastname>yin fong</lastname>
        <nickname>fong fong</nickname>
        <salary>200000</salary>
    </staff>
</company> 




 Reader in = new StringReader(message);
            Document document = (Document)saxBuilder.build(in);
            Element rootNode = document.getRootElement();
            List<?> list = rootNode.getChildren("staff", Namespace.getNamespace("xmlns="http://www.infonova.com/MediationFeed""));

            XMLOutputter outp = new XMLOutputter();
            outp.setFormat(Format.getCompactFormat());

            for (int ii = 0; ii < list.size(); ii++) {
                Element node = (Element)list.get(ii);                 

                StringWriter sw = new StringWriter();
                outp.output(node.getContent(), sw);
                StringBuffer sb = sw.getBuffer();

                String xml = sb.toString();
            }

但我的xml对象看起来像这样

 <firstname xmlns="http://www.xx.com/xx">yong</firstname>
            <lastname xmlns="http://www.xx.com/xx">mook kim</lastname>
            <nickname xmlns="http://www.xx.com/xx">mkyong</nickname>
            <salary xmlns="http://www.xx.com/xx">100000</salary>

每个元素都有命名空间。为什么这个?我不想要命名空间...我想要与xml示例中的输出相同,如

<firstname>yong</firstname>
            <lastname>mook kim</lastname>
            <nickname>mkyong</nickname>
            <salary>100000</salary>

2 个答案:

答案 0 :(得分:3)

您获得了正确的结果。所有这些元素都从命名空间“http://www.xx.com/xx”开始,因此在输出Elements时它们保留它是有意义的。请注意,在XML中,默认命名空间(没有前缀的命名空间)应用于所有后代但尚未重新定义默认命名空间的元素。

如果这看起来像是一个复杂的解释,请尝试命名空间规范:http://www.w3.org/TR/REC-xml-names/或命名空间教程:http://www.w3schools.com/xml/xml_namespaces.asp

如果您不想在这些元素上使用命名空间,可以使用以下命令删除它们:

node.setNamespace(Namespace.NO_NAMESPACE);

罗尔夫

答案 1 :(得分:0)

您必须理解XML(以其文本形式)和节点树之间的区别。在树中,没有继承或默认命名空间:每个元素节点都有自己的命名空间,无论其祖先的命名空间如何且独立。要实现所需,您必须更改所有元素节点的命名空间。在您的情况下,遍历getContent()返回的列表,并将每个元素的名称空间设置为NO_NAMESPACE。