编程语言
首页 > 编程语言> > java-从XML删除空属性

java-从XML删除空属性

作者:互联网

我有一个包含空属性的越野车xml,并且有一个解析器会咳嗽空属性.
我无法控制xml的生成,也无法控制在空attrs上咳嗽的解析器.因此,我要做的是一个预处理步骤,只需删除所有空属性即可.

我设法找到了空属性,但是现在我不知道如何删除它们:

   XPathFactory xpf = XPathFactory.newInstance();
   XPath xpath = xpf.newXPath();
   XPathExpression expr = xpath.compile("//@*");
   Object result = expr.evaluate(d, XPathConstants.NODESET);

   if (result != null) {
    NodeList nodes = (NodeList) result;
    for(int node=0;node<nodes.getLength();node++)
    {
     Node n = nodes.item(node);
     if(isEmpty(n.getTextContent()))
     {
      this.log.warn("Found empty attribute declaration "+n.toString());
      NamedNodeMap parentAttrs = n.getParentNode().getAttributes();
      parentAttrs.removeNamedItem(n.getNodeName());
     }
    }

   } 

当访问n.getParentNode().getAttributes()时,此代码为我提供了NPE.
但是,当我无法访问元素时,如何从元素中删除空属性呢?

解决方法:

以下样式表将复制源文档中的所有内容-除了仅包含空格的属性外.第一个模板只是复制所有内容-包括空属性.但是,由于使用了谓词,因此第二个模板的优先级高于第一个模板,这就是为什么当遇到空属性时,它会优先于更通用的第一个模板被选择:并且此第二个模板不会生成任何优先级输出.

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="@*[normalize-space()='']"/>
</xsl:stylesheet>

标签:jaxp,xpath,xml,java
来源: https://codeday.me/bug/20191024/1918454.html