1

为了对 XML 文件进行一些更改,我使用以下代码:

  public boolean run() throws Exception {
    XMLReader xr = new XMLFilterImpl(XMLReaderFactory.createXMLReader()) {

     public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException {
          if(AddRuleReq&& qName.equalsIgnoreCase("cp:ruleset"))
           {
             attributeList.clear();
             attributeList.addAttribute(uri, localName, "id", "int", Integer.toString(getNewRuleId()));
             super.startElement(uri, localName, "cp:rule", attributeList);
             attributeList.clear();
             super.startElement(uri, localName, "cp:conditions", attributeList);
             super.startElement(uri, localName, "SOMECONDITION", attributeList);
             super.endElement(uri, localName, "SOMECONDITION");
             super.endElement(uri, localName, "cp:conditions");
             super.startElement(uri, localName, "cp:actions", attributeList);
             super.startElement(uri, localName, "allow", attributeList);
             super.characters(BooleanVariable.toCharArray(), 0, BooleanVariable.length());
             super.endElement(uri, localName, "allow");
             super.endElement(uri, localName, "cp:actions");
           }
      }
};
  Source source = new SAXSource(xr, new InputSource(new StringReader(xmlString)));
  stringWriter = new StringWriter();
  StreamResult result = new StreamResult(stringWriter);
  Transformer transformer = TransformerFactory.newInstance().newTransformer();
  transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
  transformer.setOutputProperty(OutputKeys.INDENT, "yes");
  transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "3");
  transformer.transform(source, result);
  return stringWriter.toString();
}

我已经粘贴了一小部分并且它有效。但差别不大。

我期望看到的是:

<cp:rule id="1">
  <cp:conditions>
    <SOMECONDITION/>
  </cp:conditions>
  <cp:actions>
  <allow>
    true
  </allow>
  </cp:actions>
</cp:rule>

我看到的是:

<cp:rule id="1">
  <cp:conditions>
    <SOMECONDITION xmlns="urn:ietf:params:xml:ns:common-policy"/>
  </cp:conditions>
  <cp:actions>
  <allow xmlns="urn:ietf:params:xml:ns:common-policy">
    true
  </allow>
  </cp:actions>
</cp:rule>

根据我的架构,处理后的 XML 也是无效的,下次无法使用。

我的问题是,如何防止将这个命名空间(如本例中的 < SOMECONDITION xmlns="urn:ietf:params:xml:ns:common-policy"/>)添加到子元素中?

提前致谢..

4

1 回答 1

1

您正在使用错误的参数调用标记的startElement方法allow,我很惊讶您的 xml 处理器没有为此引发错误:

super.startElement(uri, localName, "allow", attributeList);

这是您作为参数获得uri的元素的名称空间 uri ,并且是元素的名称。正确的应该如下,使用空字符串作为命名空间 uri 并匹配 qname 和本地名称的值。cp:rulesetlocalNameruleset

super.startElement("", "allow", "allow", attributeList);

这同样适用于您的其他startElement/endElement电话,而不是

super.startElement(uri, localName, "cp:rule", attributeList);

它应该是

super.startElement(uri, "rule", "cp:rule", attributeList);
于 2013-01-07T12:36:26.370 回答