I have an XMl file that looks like:

我有一个XMl文件,看起来像:

<?xml version="1.0" encoding="UTF-8"?>
<game >
  <moves>
    <turn>2</turn>
    <piece nr="1" />
    <turn>4</turn>
    <piece nr="1" />

  </moves>
</game>

I am writing a Java program that takes the XML file as input then parses it with SAX and SAX filter and computes:

我正在编写一个Java程序,它将XML文件作为输入,然后使用SAX和SAX过滤器解析它并计算:

  • the sum of the content of turn element (here=6)
  • 转弯元素的总和(此处= 6)

  • the number of piece elements (here=2)
  • 零件数量(此处= 2)

Then I want to use a SAX filter in order to generate an output XML file that are the same as the input one but with an additional element like:

然后我想使用SAX过滤器来生成输出XML文件,该输出XML文件与输入XML文件相同,但有一个额外的元素,如:

<s:statistics>
    <s:turn-total>6</s:turn-total>
    <s:piece-count>2</s:piece-count>
</s:statistics>

The prefix s is a reference to a namespace.

前缀s是对命名空间的引用。

My program so far is:

到目前为止,我的计划是:

 public class test{     
         public static void main(String[] args) throws Exception {
                if (args.length != 2) {
                System.err.println("error ");
                System.exit(1);
                }
                String xmlInput = args[0];
                String filteredXML = args[1];
                test test1 = new test();
                    test1.sax(xmlInput, filteredXML);
            }
    private void sax(String gameXML, String filteredGameXML)throws Exception{
        FileInputStream fis = new FileInputStream( gameXML);
        InputSource is = new InputSource(fis);
        XMLReader xr = XMLReaderFactory.createXMLReader();
        XMLFilter xf = new MyFilter();
        xf.setParent(xr);
        xr = xf;
        xr.parse(is);
        xr.setFeature("http://xml.org/sax/features/namespaces", true);
        DefaultHandler handler = new DefaultHandler();
        xr.setContentHandler(handler);
    }
    private class MyFilter extends XMLFilterImpl{
             StringBuffer buffer;
         int temp=0;
             int sum=0;
             String ff;
             int numof=0;
             private MyFilter() {}

            @Override
                public void startDocument() throws SAXException {
                     System.out.println( "START DOCUMENT" );
                    numof=0;        
                }

                public void startElement(String namespaceURI, String localName, String  name,   Attributes attributes) throws SAXException{
                    if(localName.equals("turn")){
                        buffer=new StringBuffer();
                        }
                    if("piece".equals(name)){
                        numof++;
                    }
                }

                public void characters(char[] ch, int start, int length) throws SAXException {
                    String s=new String(ch, start, length);
                    if(buffer!=null){
                        buffer.append(s);
                        }
                }

                public void endElement(String uri, String localName, String name)throws SAXException {
                    if(buffer!=null ){
                        ff=buffer.toString();
                        temp=Integer.valueOf(ff);
                        sum=sum+temp;
                        }
                        buffer=null;
                }
                public void endDocument() throws SAXException {
                    System.out.println( "END DOCUMENT" );
                    System.out.println("sum of turn: "+ sum);
                    System.out.println("sum of piece: "+ numof);
                }
         }

    }

What should I do next?

接下来我该怎么办?

3 个解决方案

#1


4

Your XMLFilter should delegate to another ContentHandler that serializes the document based on the sax events.

您的XMLFilter应委托给另一个基于sax事件序列化文档的ContentHandler。

SAXTransformerFactory factory = (SAXTransformerFactory)TransformerFactory.newInstance();
TransformerHandler serializer = factory.newTransformerHandler();
Result result = new StreamResult(...);
serializer.setResult(result);

XMLFilterImpl filter = new MyFilter();
filter.setContentHandler(serializer);

XMLReader xmlreader = XMLReaderFactory.createXMLReader();
xmlreader.setFeature("http://xml.org/sax/features/namespaces", true);
xmlreader.setFeature("http://xml.org/sax/features/namespace-prefixes", true);
xmlreader.setContentHandler(filter);

xmlreader.parse(new InputSource(...));

Your callback should delegate to the super implementation, which forwards the events to the serializing ContentHandler.

您的回调应该委托给超级实现,后者将事件转发给序列化的ContentHandler。

public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException {
    super.startElement(namespaceURI, localName, qName, atts);
    ...
}

In your endElement callback you can check if your are at the final closing tag and add additional sax events.

在endElement回调中,您可以检查您是否处于最终结束标记并添加其他sax事件。

public void endElement(String namespaceURI, String localName, String qName) throws SAXException {
    super.endElement(namespaceURI, localName, qName);
    if ("game".equals(localName)) {
        super.startElement("", "statistics", "statistics", new AttributesImpl());
        char[] chars = String.valueOf(num).toCharArray();
        super.characters(chars, 0, chars.length);
        super.endElement("", "statistics", "statistics");
    }
    ...
}

更多相关文章

  1. java写入文件的几种方法小结
  2. 小聊天程序,访问文件之间的变量
  3. 请问用Java如何逐行的读取一个文本文件呀?我现在只能完整读取.
  4. FilenameFilter文件名过滤器使用实例
  5. java操作ftp实现文件的上传下载(适用于图片文档服务器)
  6. 怎么在html,Javascript,vBscript中实现从网页上接收数据存入文本
  7. Spring 3.0将文件注入资源
  8. 在tomcat服务器中部署war文件
  9. Java,Socket&TCP编程 实现多线程端对端通信与文件传输

随机推荐

  1. 如何使用XMLHttpRequest向服务器发送数组
  2. jquery validate和jquery form 插件组合
  3. 使用jquery ajax代替iframe
  4. 在没有重新设置源选项的情况下,使用x-edit
  5. 函数的作用是:显示内联块。如何?
  6. 前台jquery+ajax向后台请求数据,后台返回j
  7. 使用js和ajax从django服务器检索数据
  8. 如何删除/更改JQuery UI自动完成帮助文本
  9. jQuery的deferred对象详解
  10. js和jquery使按钮失效为不可用状态的方法