java - 避免将 XML 命名空间添加到输出消息

标签 java xml dom xml-namespaces

我正在尝试在现有 XML 中添加元素。转换后我得到 xmlns=""在添加的元素中,我不需要它。

原始 XML:

<Message version='010' release='006' 
         xsi:schemaLocation='http://www.ncpdp.org/schema/SCRIPT SS_SCRIPT_XML_10_6MU.xsd' 
         xmlns='http://www.ncpdp.org/schema/SCRIPT' 
         xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>

    <Header> ... </Header>
    <Body>
        <New> ...
            <Medication>
                ...
                <StatusCode>NF</StatusCode>
                <StatusCode>NR</StatusCode>
           </Medication>
        </New>
    </Body>
</Message>

实际(不需要的)输出:

<Message version='010' release='006' 
         xsi:schemaLocation='http://www.ncpdp.org/schema/SCRIPT SS_SCRIPT_XML_10_6MU.xsd' 
         xmlns='http://www.ncpdp.org/schema/SCRIPT' 
         xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>

    <Header> ... </Header>
    <Body>
        <New> ...
            <Medication>
                ...
                <StatusCode>NF</StatusCode>
                <StatusCode>NR</StatusCode>
                <StatusCode xmlns="">SI</StatusCode>
           </Medication>
        </New>
    </Body>
</Message>

预期输出:

<Message version='010' release='006' 
         xsi:schemaLocation='http://www.ncpdp.org/schema/SCRIPT SS_SCRIPT_XML_10_6MU.xsd' 
         xmlns='http://www.ncpdp.org/schema/SCRIPT' 
         xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>

    <Header> ... </Header>
    <Body>
        <New> ...
            <Medication>
                ...
                <StatusCode>NF</StatusCode>
                <StatusCode>NR</StatusCode>
                <StatusCode>SI</StatusCode>
           </Medication>
        </New>
    </Body>
</Message>

我不想要xmlns=""在添加的元素 <StatusCode>SI</StatusCode> 中.

Java 代码:

private DocumentBuilderFactory getDocumentBuilderFactory() {
    if (factory == null) {
        factory = DocumentBuilderFactory.newInstance();
        factory.setIgnoringElementContentWhitespace(true);
        factory.setNamespaceAware(true);
    }
    return factory;
}

public void addSIElement() throws ParserConfigurationException, SAXException, IOException, TransformerException {

     Transformer transformer = null;
     Document doc = getDocumentBuilderFactory().newDocumentBuilder().parse(new InputSource(new StringReader(xmlMsg)));

     Node list = doc.getElementsByTagName("Medication").item(0);
     Element el = doc.createElement("StatusCode");
     el.setTextContent("SI");
     list.appendChild(el);
     Source source = new DOMSource(doc);
     StringWriter writer = new StringWriter();
     Result newResult = new StreamResult(writer);
     if (transformer == null) {
         transformer = TransformerFactory.newInstance().newTransformer();
     }

     transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
     transformer.setOutputProperty(OutputKeys.INDENT, "yes");
     transformer.transform(source, newResult);

     String outStr = writer.toString();
     System.out.println("Final " + outStr);
}

最佳答案

您正在无命名空间中创建一个新元素,但原始 XML 中的所有元素都属于 http://www.ncpdp.org/schema/SCRIPT命名空间。为了正确添加元素,解析器添加 xmlns=""属性,因此该元素被声明为属于无命名空间

要解决此问题,请使用 org.w3c.dom.Document.createElementNS 创建元素提供原始文件的 namespace :

Element el = doc.createElementNS("http://www.ncpdp.org/schema/SCRIPT", "StatusCode");

关于java - 避免将 XML 命名空间添加到输出消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23488737/

相关文章:

java - 我如何知道我的 Tomcat 是否支持 Servlet 3.0?

java - struts2+tiles2 java.lang.ClassNotFoundException : org. apache.struts.taglib.bean.CookieTei

java - 如何同步 Solr 导入过程?

c# - 序列化时重命名 xml 模式类中的属性

javascript - ngRepeat 的速度问题。是否可以在 AngularJS 中重用 DOM 部分?

javascript - 有什么方法可以跟踪 iframe 的 designMode 中的选择范围吗?

java - 使用 Enum 类而不是 Map 来保存常量

c# - 将自定义 DataContractResolver 与多个程序集一起使用

java - 如何获取有关第一个 Activity 的按钮单击的信息并在第三个 Activity 中使用它? - 安卓

javascript - 如何在 javascript 中围绕一段文本换行?