java - 转换 XML 时出错

标签 java xml transformation

我在解析 xml 以及实际转换它时遇到问题。

我得到的错误是:

ERROR:  'Namespace for prefix 'SOAP-ENV' has not been declared.'
Jul 8, 2011 3:24:54 PM kumar.runs.start$2 run
SEVERE: null
javax.xml.transform.TransformerException: java.lang.RuntimeException: Namespace for prefix 'SOAP-ENV' has not been declared.
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:716)
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:313).........

我使用的代码是:

    SAXParserFactory saxFactory = SAXParserFactory.newInstance(); 
    SAXParser parser = saxFactory.newSAXParser(); 
    XMLReader reader = new XMLTrimFilter(parser.getXMLReader()); 

    TransformerFactory factory = TransformerFactory.newInstance(); 
    Transformer transformer = factory.newTransformer(); 
    transformer.setOutputProperty(OutputKeys.INDENT, "no"); 
    DOMResult result = new DOMResult(); 
    SAXSource ss = new SAXSource(reader, is);
    transformer.transform(ss, result); 
    return (Document)result.getNode(); 

XMLTrimFilter 是自定义实现,扩展了 XMLFilterImpl。

我还发现了这个:

A Bug

但这是一个相当老的问题。 有人知道如何修复它吗?

谢谢!

[编辑: xml:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:enc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    <SOAP-ENV:Header />
    <SOAP-ENV:Body>
            <swp:addOwnRet xmlns:swbep="urn:SWBEP">
                  <apples>33</apples>
                  <bucket>
                    <orange>5</orange>
                    <banana>5</banana>
                  </bucket>
            </swp:addOwnRet>
    </SOAP-ENV:Body>

]

编辑2:

XMLTrimFilter:

package kumar.srcs;

导入java.io.CharArrayWriter; 导入 org.xml.sax.Attributes; 导入 org.xml.sax.SAXException; 导入 org.xml.sax.XMLReader; 导入 org.xml.sax.helpers.XMLFilterImpl;

公共(public)类 XMLTrimFilter 扩展 XMLFilterImpl{

private CharArrayWriter contents = new CharArrayWriter(); 

public XMLTrimFilter(XMLReader parent){ 
    super(parent); 
} 
public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException{ 
    writeContents(); 
    super.startElement(uri, localName, qName, atts); 
}

public void characters(char ch[], int start, int length){ 
    contents.write(ch, start, length); 
} 

public void endElement(String uri, String localName, String qName) throws SAXException{ 
    writeContents(); 
    super.endElement(uri, localName, qName); 
} 

public void ignorableWhitespace(char ch[], int start, int length){} 

private void writeContents() throws SAXException{ 
    char ch[] = contents.toCharArray(); 
    if(!isWhiteSpace(ch)) 
        super.characters(ch, 0, ch.length); 
    contents.reset(); 
} 

private boolean isWhiteSpace(char ch[]){ 
    for(int i = 0; i<ch.length; i++){ 
        if(!Character.isWhitespace(ch[i])) 
            return false; 
    } 
    return true; 
} 

}

最佳答案

我们没有足够的信息,但我怀疑的前两件事是:

  1. 输入 XML 未正确声明 namespace ;即它是无效的 XML。

  2. 您的自定义 XMLTrimFilter 类中存在错误。

<小时/>

Sun bug 是针对一个非常旧的 JAXP 版本的,并且很久以前就被修复了。对我来说,这与你的情况不太相似。

<小时/>

您粘贴的 XML 缺少 namespace 声明,如果您尝试使用验证 namespace 感知的 XML 解析器来解析它,将会出现错误。尽管错误消息看起来不正确,但这可能是导致您出现问题的原因。更可能的原因是您的自定义过滤器,IMO。

关于java - 转换 XML 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6624449/

相关文章:

C- 在一维字节数组中索引 x、y、z 坐标

java - 采取动态输入的一副纸牌

java - 使用批处理脚本清除 Selenium 测试中的临时文件夹

php - 在 XML 的 post 方法中有选择地放置元素,有什么想法吗?

php - 转储非 ASCII 字符时 DOMDocument 行为不一致的解释是什么?

xml - LINQ to XML 查询属性

windows-phone-7 - 查找多边形坐标WP7

r - 如何使用彩色置信区间带绘制回归原始比例的回归图?

java - 从输入 IST 日期和时间获取加拿大/东部偏移量

java - 如何在数组中添加枚举类型值