Java 如何从org.w3c.dom.Document中删除特定的xml属性

Java 如何从org.w3c.dom.Document中删除特定的xml属性,java,xml,dom,Java,Xml,Dom,我有以下XML: <Body xmlns:wsu="http://mynamespace"> <Ticket xmlns="http://othernamespace"> <Customer xlmns="">Robert</Customer> <Products xmlns=""> <Product>a product</> </Products>

我有以下XML:

<Body xmlns:wsu="http://mynamespace">           
 <Ticket xmlns="http://othernamespace">
  <Customer xlmns="">Robert</Customer>
  <Products xmlns="">
   <Product>a product</>
  </Products>               
 </Ticket>
 <Delivered xmlns="" />
 <Payment xlmns="">cash</Payment>
</Body>

罗伯特
产品
现金

我使用Java将其作为DOM文档读取。我想删除空名称空间属性(即,
xmlns=”“
)。有什么方法可以做到这一点吗?

您需要了解
xmlns
是一个非常特殊的属性。基本上,
xmlns=”“
是这样的,您的
Customer
元素位于“未命名”命名空间中,而不是
http://othernamespace
namespace(同样,对于其他将从其祖先继承默认名称空间的元素)


如果您想摆脱
xmlns=“”
,基本上需要将元素放入适当的名称空间-因此它正在更改元素名称。我认为W3CAPI不允许您更改元素的名称——您可能需要使用适当的名称空间创建一个新元素,并复制内容。或者,如果您负责创建文档,请使用正确的名称空间。

谢谢!但现在我的问题是:如果我删除空的客户名称空间(在本例中为xmlns=“”),那么默认情况下我不会引用顶级名称空间吗?i、 e.“http://othernamespace”case@user1750751:是的,你会的。基本上,您需要确定
Customer
元素应该位于哪个名称空间中-如果您希望它位于空名称空间中,那么请保留
xmlns=“”
。如果您想在
http://othernamespace
,取出它。或者,将父元素更改为:
,这样就不会设置默认值。Jon,我有一个与您回答相同的问题:@user1750751:这是在使用Axis。。。老实说,您的上下文是什么还不清楚。Axis生成了那个xml。但是我有“elemField.setXmlName(new javax.xml.namespace.QName(“http://othernamespace/”,“customer”);”所以,我想删除“manualy”(通过代码),这是整个文档还是仅仅是一个片段?如果它是整个文档,那么序列化程序不应该将
xmlns=”“
添加到
交付的
支付
元素中,因为它们没有继承的默认命名空间可覆盖。它是一个片段。顶部带有ws-security的标题部分。该xml是axis的WS-request生成器。我不知道为什么axis会把它放在那里,因为它是空的名称空间。如果你有一个不在名称空间中的DOM元素,并且你试图将它添加到一个默认名称空间有效的树中,那么XML序列化程序就别无选择——它必须添加
xmlns=“”
,以便准确地输出你给它的XML。如果不希望使用
xmlns=“”
,则必须确保创建的元素的名称空间与在插入元素的位置有效的默认名称空间相同。不能“删除”名称空间声明,序列化程序将自动创建匹配节点所在名称空间所需的任何声明。如果名称空间是正确的,那么声明也将自动正确。