java
  • xml
  • dom
  • xml-namespaces
  • 2014-05-06 60 views 1 likes 
    1

    我试图在现有XML中添加一个元素。改造后,我得到了xmlns=""添加元素,我不需要。避免将XML名称空间添加到输出消息

    原始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> 
    

    我做不想在添加的元素<StatusCode>SI</StatusCode>中输入xmlns=""

    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); 
    } 
    

    回答

    1

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

    为了解决这个问题,创建使用org.w3c.dom.Document.createElementNS提供原始文件的命名空间的元素:

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

    由于它的工作。 – Guest

    相关问题