JDOM Parser и пространство имен, как получить чистый контент

МОЙ 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>

person senzacionale    schedule 04.10.2012    source источник


Ответы (2)


Вы получаете правильные результаты. Все эти элементы начинаются с пространства имен «http://www.xx.com/xx», поэтому имеет смысл сохранить его при выводе элементов. Обратите внимание, что в XML пространство имен по умолчанию (без префикса) применяется ко всем элементам, которые являются потомками, но сами не переопределили пространства имен по умолчанию.

Если это кажется сложным объяснением, попробуйте спецификацию пространства имен: http://www.w3.org/TR/REC-xml-names/ или руководство по пространству имен: http://www.w3schools.com/xml/xml_namespaces.asp

Если вы не хотите иметь пространства имен для этих элементов, вы можете удалить их с помощью:

node.setNamespace(Namespace.NO_NAMESPACE);

Рольф

person rolfl    schedule 04.10.2012
comment
я пробую этот код, но пространства имен все еще там. когда я использую String xml = sb.toString(); я все еще вижу пространства имен... - person senzacionale; 05.10.2012

Вы должны понимать разницу между XML (в его текстовой форме) и деревом узлов. В дереве нет такого понятия, как унаследованное пространство имен или пространство имен по умолчанию: каждый узел элемента имеет свое собственное пространство имен, независимо от пространства имен его предка. Чтобы достичь желаемого, вы должны изменить пространство имен всех узлов элементов. В вашем случае выполните итерацию по списку, возвращаемому getContent(), и установите пространство имен для каждого элемента в NO_NAMESPACE.

person forty-two    schedule 08.10.2012