Избегайте пространства имен при разборе xml с woodstox - PullRequest
0 голосов
/ 10 декабря 2018

Я пытаюсь проанализировать XML-файл и удалить пространства имен и префиксы, используя синтаксический анализатор woodstox (xml содержит вложенные элементы, а каждый элемент содержит пространство имен на каждом уровне)

Ниже приведен код, который я использую для анализа.получить тот же вход, что и я. Пожалуйста, помогите в решении проблемы

byte[] byteArray = null;
        try {
            File file = new File(xmlFileName);
            byteArray = new byte[(int) file.length()];
            byteArray = FileUtils.readFileToByteArray(file);
        } catch (Exception e) {
            e.printStackTrace();

        }

        InputStream articleStream = new ByteArrayInputStream(byteArray);


        WstxInputFactory xmlInputFactory = (WstxInputFactory) XMLInputFactory.newInstance();

        xmlInputFactory.configureForSpeed();
        // xmlInputFactory.configureForXmlConformance();
        XMLStreamReader2 xmlStreamReader = (XMLStreamReader2) xmlInputFactory.createXMLStreamReader(articleStream,
                StandardCharsets.UTF_8.name());

        xmlStreamReader.setProperty(XMLInputFactory.IS_COALESCING, true);

        WstxOutputFactory xmloutFactory = (WstxOutputFactory) XMLOutputFactory2.newInstance();

        StringWriter sw = new StringWriter();
        XMLEventWriter xw = null;

        XMLStreamWriter2 xmlwriter = (XMLStreamWriter2) xmloutFactory.createXMLStreamWriter(sw,
                StandardCharsets.UTF_8.name());
        xmlwriter.setNamespaceContext(new NamespaceContext() {

            @Override
            public String getNamespaceURI(String prefix) {
                return "";
            }

            @Override
            public String getPrefix(String namespaceURI) {
                return "";
            }

            @Override
            public Iterator getPrefixes(String namespaceURI) {
                return null;
            }

        });


        while (xmlStreamReader.hasNext()) {
            xmlStreamReader.next();

            xmlwriter.copyEventFromReader(xmlStreamReader, false);
        }
        System.out.println("str" + xmlwriter.getNamespaceContext().getPrefix(""));

        xmlwriter.closeCompletely();
        xmlwriter.flush();

        xmlStreamReader.closeCompletely();
        xmlStreamReader.close();

1 Ответ

0 голосов
/ 14 декабря 2018

Если вы хотите удалить все префиксы и привязки пространства имен, вы НЕ должны использовать методы копирования - они будут буквально копировать эти вещи.Вместо этого читайте имена элементов и атрибутов, но записывайте только с использованием «локальных имен» и оставляйте namespaceURI и prefix в качестве нулей (или используйте методы, которые принимают только локальные имена).

...