在文件上写DOM时,XMLNS属性被剥离

时间:2011-11-28 14:14:06

标签: java xml dom xml-namespaces

我有一个xml文件,看起来像这样

     <?xml version="1.0" encoding="UTF-8" ?> 
 <BulkDataExchangeRequests xmlns="urn:ebay:apis:eBLBaseComponents">
 <Header>
  <Version>583</Version> 
  <SiteID>0</SiteID> 
  </Header>
 <AddFixedPriceItemRequest xmlns="urn:ebay:apis:eBLBaseComponents">
  <ErrorLanguage>en_US</ErrorLanguage> 
  <WarningLevel>High</WarningLevel> 
  <Version>583</Version> 
 <Item>
  <CategoryMappingAllowed>true</CategoryMappingAllowed> 
  <ConditionID>1000</ConditionID> 
  <Country>US</Country> 
  <Currency>USD</Currency> 
  <Description>Minimal fixed-price shoe listing with SKU, free shipping, 3-day dispatch time, return policy, and no Item Specifics. New Nike Shox Elite TB White/White-Black-Chrome. Size: Mens US 12, UK 11, Europe 46 (Medium, D, M). Condition: New in box.</Description> 
  <DispatchTimeMax>3</DispatchTimeMax> 
  <InventoryTrackingMethod>SKU</InventoryTrackingMethod> 
  <ListingDuration>Days_30</ListingDuration> 
  <ListingType>FixedPriceItem</ListingType> 
  <Location>San Jose, CA</Location> 
  <PaymentMethods>PayPal</PaymentMethods> 
  <PayPalEmailAddress>MegaOnlineMerchant@gmail.com</PayPalEmailAddress> 
 <PrimaryCategory>
  <CategoryID>63850</CategoryID> 
  </PrimaryCategory>
  <Quantity>6</Quantity> 
 <ReturnPolicy>
  <ReturnsAcceptedOption>ReturnsAccepted</ReturnsAcceptedOption> 
  <RefundOption>MoneyBack</RefundOption> 
  <ReturnsWithinOption>Days_30</ReturnsWithinOption> 
  <Description>Text description of return policy details here.</Description> 
  <ShippingCostPaidByOption>Buyer</ShippingCostPaidByOption> 
  </ReturnPolicy>
 <ShippingDetails>
  <ShippingType>Flat</ShippingType> 
 <ShippingServiceOptions>
  <ShippingServicePriority>1</ShippingServicePriority> 
  <ShippingService>USPSPriority</ShippingService> 
  <ShippingServiceCost currencyID="USD">0.0</ShippingServiceCost> 
  <ShippingServiceAdditionalCost>0.00</ShippingServiceAdditionalCost> 
  <FreeShipping>true</FreeShipping> 
  </ShippingServiceOptions>
  </ShippingDetails>
  <Site>US</Site> 
  <SKU>1122334455-36</SKU> 
  <StartPrice>50.00</StartPrice> 
  <Title>Latest Nike Shox Elite TB White Mens Basketball Shoes S 12</Title> 
  <UUID>7d004a30b0f511ddad8b0807654c9a55</UUID> 
  </Item>
  </AddFixedPriceItemRequest>

当我从java修改这个xml以放置一个新的UUID时,AddFixedPriceItemRequest元素丢失了它的xmlns =“urn:ebay:apis:eBLBaseComponents”属性。 我使用以下代码。

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            factory.setNamespaceAware(true);
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document doc = builder.parse(new File(path + System.getProperty("file.separator") + "sc_input" + System.getProperty("file.separator") + "input.xml"));

NodeList list = doc.getElementsByTagName("UUID");
            for (int i = 0; i < list.getLength(); i++) {
                // Get element
                Element element = (Element) list.item(i);
                System.out.println(element.getTextContent());

                element.setTextContent(java.util.UUID.randomUUID().toString().replace("-", ""));
            }
            //setting up a transformer
            TransformerFactory transfac = TransformerFactory.newInstance();
            Transformer trans = transfac.newTransformer();

            //generating string from xml tree
            StringWriter sw = new StringWriter();
            StreamResult result = new StreamResult(sw);
            DOMSource source = new DOMSource(doc);
            trans.transform(source, result);
            String xmlString = sw.toString();

            //Saving the XML content to File
            OutputStream f0;
            byte buf[] = xmlString.getBytes();
            f0 = new FileOutputStream(path + System.getProperty("file.separator") + "sc_input" + System.getProperty("file.separator") + "input.xml");
            for (int i = 0; i < buf.length; i++) {
                f0.write(buf[i]);
            }
            f0.close();
            buf = null;

我试图通过使用以下

设置该特定元素的命名空间来纠正这个问题
 NodeList nodeList = doc.getElementsByTagName("AddFixedPriceItemRequest");
                for(int j = 0; j < nodeList.getLength(); j++){
                    Element element = (Element) nodeList.item(j);
                    if(!element.hasAttributes()){
                    element.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns","urn:ebay:apis:eBLBaseComponents");
                    }
                    System.out.println(element.getNodeValue());
   }

但这似乎不起作用。

1 个答案:

答案 0 :(得分:1)

是的,这是完全有效的输出。由于AddFixedPriceItemRequest元素嵌套在BulkDataExchangeRequests元素下,因此AddFixedPriceItemRequest元素上的xmlns声明是多余的。

更新: 如果由于某种原因你需要冗余的xmlns,你可以尝试为BulkDataExchangeRequests元素使用不同的名称空间前缀。