You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@poi.apache.org by "PJ Fanning (Jira)" <ji...@apache.org> on 2021/12/23 19:14:00 UTC

[jira] [Resolved] (XMLBEANS-583) Duplicated "xmlns" attribute in XmlObject.toString() result

     [ https://issues.apache.org/jira/browse/XMLBEANS-583?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

PJ Fanning resolved XMLBEANS-583.
---------------------------------
      Assignee: PJ Fanning
    Resolution: Fixed

test added

> Duplicated "xmlns" attribute in XmlObject.toString() result
> -----------------------------------------------------------
>
>                 Key: XMLBEANS-583
>                 URL: https://issues.apache.org/jira/browse/XMLBEANS-583
>             Project: XMLBeans
>          Issue Type: Bug
>    Affects Versions: Version 5.0.0
>            Reporter: Dmitry Lastochkin
>            Assignee: PJ Fanning
>            Priority: Major
>             Fix For: Version 5.0.3
>
>         Attachments: schemas.zip
>
>          Time Spent: 20m
>  Remaining Estimate: 0h
>
> Hello! 
> I ran into the following problem: in some cases, {{XmlObject.toString()}} returns an XML containing duplicated "xmlns" attribute, as shown bellow
> {code:xml}
> <Ns2E1 xmlns="XmlToStringTest2Xsd.xsd">
>   <Ns2T1E1 xmlns="" xmlns="XmlToStringTest2Xsd.xsd">
>     <Ns1T1E1 xmlns="XmlToStringTest1Xsd.xsd">Ns1T1E1</Ns1T1E1>
>   </Ns2T1E1>
> </Ns2E1>
> {code}
> I wrote a simple test that reproduces the error (you can find test XSDs in [^schemas.zip]):
> {code:java}
> public class XmlToStringTest {
>     @Test
>     public void test() {
>         try {
>             final Ns2E1Document ns2e1Doc = Ns2E1Document.Factory.newInstance();
>             ns2e1Doc.addNewNs2E1().addNewNs2T1E1().setNs1T1E1("Ns1T1E1");
>             
>             final Ns3E1Document ns3e1Doc = Ns3E1Document.Factory.newInstance();
>             ns3e1Doc.addNewNs3E1().setNs3T1E1(Ns1T1.Factory.parse(ns2e1Doc.getNs2E1().getNs2T1E1().toString()));
>             
>             final Ns3E1Document pNs3e1Doc = Ns3E1Document.Factory.parse(ns3e1Doc.toString());
>             final Ns2E1Document pNs2e1Doc = Ns2E1Document.Factory.newInstance();
>             pNs2e1Doc.addNewNs2E1().setNs2T1E1(pNs3e1Doc.getNs3E1().getNs3T1E1());
>             
>             System.out.println(pNs2e1Doc.toString());
>             Ns2E1Document.Factory.parse(pNs2e1Doc.toString());
>         } catch (Exception ex) {
>             ex.printStackTrace();
>             Assert.fail();
>         }
>     }
> }
> {code}
> I investigated the problem and found the cause. In the {{Saver.tryPrefix()}} I found the following comment:
> {quote}
> // If the prefix is currently mapped, then try another prefix.  A
> // special case is that of trying to map the default prefix ("").
> // Here, there always exists a default mapping.  If this is the
> // mapping we found, then remap it anyways. *I use != to compare*
> // strings because I want to test for the *specific* initial default
> // uri I added when I initialized the saver.
> {quote}
> But the code following this comment looks like this:
> {code:java}
> return existingUri == null || (prefix.length() <= 0 && Objects.equals(existingUri, _initialDefaultUri)); // Objects.equals, not ==
> {code}
>  
> And {{_initialDefaultUri}} initialized like this:
> {code:java}
> _initialDefaultUri = "";
> {code}
> But should be
> {code:java}
> _initialDefaultUri = new String("");
> {code}
> because we talk about a *specific* value.
> Hopefully this information helps fix this bug.



--
This message was sent by Atlassian Jira
(v8.20.1#820001)

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@poi.apache.org
For additional commands, e-mail: dev-help@poi.apache.org