2015-02-19 3 views
0

Я генерируя этот XML:Неожиданное атрибут в сгенерированном XML

<?xml version="1.0" encoding="UTF-8"?> 
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> 
    <sitemap xmlns="" id="0"> 
     <loc>http://x.ae/sitemap-url/ae/sitemap-index.xml</loc> 
     <lastmod>2015-02-19</lastmod> 
    </sitemap> 
    <sitemap xmlns="" id="1"> 
     <loc>http://x.bh/sitemap-url/bh/sitemap-index.xml</loc> 
     <lastmod>2015-02-19</lastmod> 
    </sitemap> 
    <sitemap xmlns="" id="2"> 
     <loc>http://x.eg/sitemap-url/eg/sitemap-index.xml</loc> 
     <lastmod>2015-02-19</lastmod> 
    </sitemap> 
    <sitemap xmlns="" id="3"> 
     <loc>http://x.ma/sitemap-url/ma/sitemap-index.xml</loc> 
     <lastmod>2015-02-19</lastmod> 
    </sitemap> 
    <sitemap xmlns="" id="4"> 
     <loc>http://x.om/sitemap-url/om/sitemap-index.xml</loc> 
     <lastmod>2015-02-19</lastmod> 
    </sitemap> 
    <sitemap xmlns="" id="5"> 
     <loc>http://x.qa/sitemap-url/qa/sitemap-index.xml</loc> 
     <lastmod>2015-02-19</lastmod> 
    </sitemap> 
    <sitemap xmlns="" id="6"> 
     <loc>http://x.tn/sitemap-url/tn/sitemap-index.xml</loc> 
     <lastmod>2015-02-19</lastmod> 
    </sitemap> 
</sitemapindex> 

Я пытаюсь удалить этот атрибут: <sitemap xmlns="">, но это не возможно. Что я делаю неправильно?

Это мой код для генерации XML:

DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); 
     Document doc = docBuilder.newDocument(); 
     //ROOT ELEMENT: 
     Element rootElement = doc.createElementNS("http://www.sitemaps.org/schemas/sitemap/0.9", "sitemapindex"); 
     doc.appendChild(rootElement); 



     SortedSet<Country> countries = locationDao.readAllCountriesSorted(); 
     int i =0; 
     for(Country c : countries){ 
      Element siteMap = doc.createElement("sitemap"); 

      siteMap.setAttribute("id", String.valueOf(i)); 
      //PUT AN ID 
      Element loc = doc.createElement("loc"); 
      Element lastMod = doc.createElement("lastmod"); 

      loc.appendChild(doc.createTextNode("http://"+c.getDomain()+"/sitemap-url/"+c.getCode().toLowerCase()+"/sitemap-index.xml")); 
      lastMod.appendChild(doc.createTextNode(DateUtils.getCurrentDateString())); 

      rootElement.appendChild(siteMap); 
      siteMap.appendChild(loc); 
      siteMap.appendChild(lastMod); 
     i++; 
     } 

     ;//always appear. 
     TransformerFactory transformerFactory = TransformerFactory.newInstance(); 
     Transformer transformer = transformerFactory.newTransformer(); 


     //IDENTEM EL RESULTAT 
     transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 
     //transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); 
     DOMSource source = new DOMSource(doc); 
     //Si ho volem mostrar en un file: 
     StreamResult result = new StreamResult(new File("sitemapTest.xml")); 
     //StreamResult result = new StreamResult(System.out); 
     transformer.transform(source, result); 

     System.out.println("Document ready...."); 

Я пытаюсь удалить с removeAttribute методом или removeAttNs, но, похоже, не работает ..

+0

Вы имеете в виду атрибут xmlns = ""? – aurelius

+0

yes xmnls in sitemap node ... – SergiM

ответ

2

Создайте sitemap, loc, lastmod элементы в собственном пространстве имен (вы в настоящее время создаете его в пустом пространстве имен, которое в этом случае не является пространством имен по умолчанию):

Element siteMap = doc.createElementNS("http://www.sitemaps.org/schemas/sitemap/0.9", "sitemap"); 
//... 
Element loc = doc.createElementNS("http://www.sitemaps.org/schemas/sitemap/0.9", "loc"); 
Element lastMod = doc.createElementNS("http://www.sitemaps.org/schemas/sitemap/0.9", "lastmod"); 
+0

, но здесь http://www.sitemaps.org/protocol.html#escaping ничего не указывает. Будет ли правильно? – SergiM

+0

Да, будет. Вы должны различать абстрактную концепцию пространства имен и лексикализацию в XML-файле: абстрактная концепция гласит, что все ваши элементы в дереве карты Sitemap принадлежат к тому же пространству имен, которое вы задали для элемента 'sitemapindex'. В выводе xml он записывается только в корень соответствующего поддерева (который в этом случае является корневым элементом всего xml-файла). поскольку вы устанавливаете его как пространство имен по умолчанию, никакие префиксы не привязаны к имени дочерних элементов. – collapsar

+0

отличный чувак..ти. :) – SergiM

0

Это время, так как я сделал XML с DOM на Java, но если я правильно помню, вы должны установить пространство имен для всех элементов, поэтому ваш dom знает, какое пространство имен использовать. Если он этого не знает, он создаст пустой XML-Namepsace (short: xmlns), который приведет к тому, что вы увидите пустой атрибут.

0

Это не атрибут, это объявление пространства имен. Эффект объявления пространства имен заключается в том, чтобы убедиться, что ваши элементы Sitemap не находятся в пространстве имен. Это необходимо, потому что, когда вы создали элементы sitemap, вы попросили, чтобы они не были в пространстве имен. Если вы хотите, чтобы они находились в пространстве имен «http://www.sitemaps.org/schemas/sitemap/0.9», вы должны создать их в том пространстве имен, которое вы используете с помощью createElementNS().