Удалить пространство имен из тега

Я искал в SO, но я не нашел ничего, что решает мою проблему. Я надеюсь, что кто-то может помочь мне.

Я строю файл XML, и мне нужно удалить пространство имен xmlns,

Это мой код

Document xmlDocument = new Document();
Namespace ns1 = Namespace.getNamespace("urn:iso:std:iso:20022:tech:xsd:pain.001.001.03");
Namespace ns2 = Namespace.getNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance");
Element root = new Element("Document", ns1);
root.addNamespaceDeclaration(ns2);
xmlDocument.setRootElement(root);
Element CstmrCdtTrfInitn = new Element("CstmrCdtTrfInitn");
root.addContent(CstmrCdtTrfInitn);

PrintDocumentHandler pdh = new PrintDocumentHandler();
pdh.setXmlDocument(xmlDocument);
request.getSession(false).setAttribute("pdh", pdh);

ByteArrayOutputStream sos = new ByteArrayOutputStream();
XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat());
Format format = outputter.getFormat();
format.setEncoding(SOPConstants.ENCODING_SCHEMA);
outputter.setFormat(format);
outputter.output(root, sos);
sos.flush();
return sos;

И это созданный XML-файл

<?xml version="1.0" encoding="UTF-8"?>
<Document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03">
    <CstmrCdtTrfInitn xmlns=""/>
</Document>

Я должен удалить пространство имен xmlns из тега CstmrCdtTrfInitn,

Спасибо заранее.

2 ответа

Решение

Объявление пространства имен без префикса (xmlns="...") известен как пространство имен по умолчанию. Обратите внимание, что, в отличие от префиксного пространства имен, элементы-потомки без префикса неявно наследуют пространство имен по умолчанию предка. Итак, в XML ниже, <CstmrCdtTrfInitn> считается в пространстве имен urn:iso:std:iso:20022:tech:xsd:pain.001.001.03:

<Document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03">
    <CstmrCdtTrfInitn/>
</Document>

Если это желаемый результат, вместо того, чтобы пытаться удалить xmlns="" позже вы должны попытаться создать CstmrCdtTrfInitn используя то же пространство имен, что и Document на первом месте:

Element CstmrCdtTrfInitn = new Element("CstmrCdtTrfInitn", ns1);

Я сделал некоторый код для вас, я не знаю, какой пакет вы используете... Если вы хотите удалить только атрибут xmlns из тега CstmrCdtTrfInitn, попробуйте использовать этот код в качестве другого метода для генерации XML (я только что изменил это):

    DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder docBuilder = docFactory.newDocumentBuilder();

    // root elements
    Document doc = docBuilder.newDocument();
    Element rootElement = doc.createElement("Document");
    rootElement.setAttribute("xmlns", "urn:iso:std:iso:20022:tech:xsd:pain.001.001.03");
    rootElement.setAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");

    doc.appendChild(rootElement);

    // staff elements
    Element CstmrCdtTrfInitn = doc.createElement("CstmrCdtTrfInitn");
    rootElement.appendChild(CstmrCdtTrfInitn);


    // write the content into xml file
    TransformerFactory transformerFactory = TransformerFactory.newInstance();
    Transformer transformer = transformerFactory.newTransformer();
    DOMSource source = new DOMSource(doc);

    // Output to console for testing
    StreamResult result = new StreamResult(System.out);

    transformer.transform(source, result);

  } catch (ParserConfigurationException pce) {
    pce.printStackTrace();
  } catch (TransformerException tfe) {
    tfe.printStackTrace();
  }
Другие вопросы по тегам