Java 在文件上写入DOM时删除XMLNS属性
我有一个xml文件,看起来像这样Java 在文件上写入DOM时删除XMLNS属性,java,xml,dom,xml-namespaces,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>
<?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>
583
0
恩努斯
高
583
真的
1000
美国
美元
最低固定价格的鞋子清单,包括SKU、免费送货、3天发货时间、退货政策和无物品细节。全新Nike Shox Elite TB白色/黑白铬合金。尺码:男式美国12码,英国11码,欧洲46码(中号,D码,M码)。条件:新的输入框。
3.
SKU
第30天
固定价格项目
加利福尼亚州圣何塞
贝宝
MegaOnlineMerchant@gmail.com
63850
6.
接受退货
退款
第30天
此处为退货政策详细信息的文本说明。
买主
平的
1.
美国精神
0
0
真的
美国
1122334455-36
50
最新Nike Shox Elite TB White男子篮球鞋S 12
7D004A30B0F511DDAD8B087654C9A55
当我从java修改此xml以放置新的UUID时,AddFixedPriceItemRequest元素将丢失其xmlns=“urn:ebay:api: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;
DocumentBuilderFactory=DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
DocumentBuilder=factory.newDocumentBuilder();
Document doc=builder.parse(新文件(path+System.getProperty(“File.separator”)+“sc_输入”+System.getProperty(“File.separator”)+“input.xml”);
节点列表=doc.getElementsByTagName(“UUID”);
对于(int i=0;i
我试图通过使用以下方法设置特定元素的名称空间来纠正这一点
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());
}
NodeList NodeList=doc.getElementsByTagName(“AddFixedPriceItemRequest”);
对于(int j=0;j
但这似乎不起作用。是的,这是完全有效的输出。由于AddFixedPriceItemRequest元素嵌套在BulkDataExchangeRequests元素下,因此AddFixedPriceItemRequest元素上的xmlns声明是多余的 更新:
如果出于某种原因需要冗余的xmlns,可以尝试为BulkDataExchangeRequests元素使用不同的名称空间前缀。我知道,一旦在根目录中声明了它,就不需要为AddFixedPriceItemrequest声明,但Ebay需要这样做。我需要一些方法把它放回那里,这样我的文件才能被Ebay正确处理。@Amit-真的吗?这么大的公司需要非标准的xml语义,这让我感到惊讶。如果不存在,会发生什么情况?如果我没有为AddFixedPricedItemBut添加xmlns,则会出现以下错误Failure SystemError如果我将名称空间添加到AddFixedPriceItem标记,易趣会处理它,而不会出现任何问题。@Amit-您是否尝试过我对不同前缀的建议?