# HG changeset patch # User tatsuki # Date 1414103380 -32400 # Node ID faedeec9760547c52589cebc78dd61f1df2dad20 read Jungle xml diff -r 000000000000 -r faedeec97605 src/main/java/ac/jp/u_ryukyu/cr/ie/tatsuki/xmlReader/ReadXmlHandler.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/ac/jp/u_ryukyu/cr/ie/tatsuki/xmlReader/ReadXmlHandler.java Fri Oct 24 07:29:40 2014 +0900 @@ -0,0 +1,128 @@ +package ac.jp.u_ryukyu.cr.ie.tatsuki.xmlReader; + +import java.nio.ByteBuffer; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTree; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTreeEditor; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNodePath; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Pair; + +import org.xml.sax.*; +import org.xml.sax.helpers.*; + +import fj.test.reflect.Name; + +class ReadXmlHandler extends DefaultHandler { + private JungleTree tree; + private JungleTreeEditor editor; + private NodePath path; + + public ReadXmlHandler(JungleTree tree){ + this.tree = tree; + this.editor = tree.getTreeEditor(); + this.path = new DefaultNodePath().add(-1); + } + + @Override + public void startElement(String uri, String localName,String qName, Attributes attributes) { + Pair nodePair = path.last(); + path = nodePair.right(); + int num = nodePair.left() + 1; + + Either either = editor.addNewChildAt(path, num); + if (either.isA()) { + //error + } + this.editor = either.b(); + + path = path.add(num); + System.out.println(path.toString()); + + + if (uri != "") { + System.out.println("namespaceURI= " + uri); + } + + if (localName != "") { + System.out.println("localName= " + localName); + } + + if (qName != "") { + System.out.println("qName= " + qName); + Either newEither = editor.putAttribute(path, "element", ByteBuffer.wrap(qName.getBytes())); + if (newEither.isA()) { + //error + } + this.editor = newEither.b(); + } + + if (attributes.getLength() != 0) { + for (int count = 0 ;attributes.getLength() > count; count++) { + System.out.println(attributes.getLocalName(count) + " = " + attributes.getValue(count)); + Either newEither = editor.putAttribute(path,attributes.getLocalName(count) , ByteBuffer.wrap(attributes.getValue(count).getBytes())); + if (newEither.isA()) { + //error + } + this.editor = newEither.b(); + } + } + path = path.add(-1); + } + + @Override + public void characters(char[] ch, int start, int length) { + String str = new String(ch, start, length); + Pattern pattern = Pattern.compile("\n"); + Matcher macher = pattern.matcher(str); + + if (!macher.find()) { + Pair nodePair = path.last(); + NodePath onePath = nodePair.right(); + System.out.println(str); + Either newEither = editor.putAttribute(onePath, "text", ByteBuffer.wrap(str.getBytes())); + if (newEither.isA()) { + //error + } + this.editor = newEither.b(); + } + } + + @Override + public void endElement(String namespaceURI, String localName, String qName) { + path = path.tail(); + if (namespaceURI != "") { + System.out.println("namespaceURI= " + namespaceURI); + } + if (localName != "") { + System.out.println("localName= " + localName); + } + + if (qName != "") { + System.out.println("qName= " + qName); + } + } + + @Override + public void startDocument() { + System.out.println("start"); + } + + @Override + public void endDocument() { + Either either = editor.success(); + if (either.isA()) { + //error + } + System.out.println("end"); + } + + public JungleTree getTree(){ + return tree; + } + +} diff -r 000000000000 -r faedeec97605 src/main/java/ac/jp/u_ryukyu/cr/ie/tatsuki/xmlReader/SaxSample.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/ac/jp/u_ryukyu/cr/ie/tatsuki/xmlReader/SaxSample.java Fri Oct 24 07:29:40 2014 +0900 @@ -0,0 +1,31 @@ +package ac.jp.u_ryukyu.cr.ie.tatsuki.xmlReader; + +import java.io.*; + +import javax.xml.parsers.*; + +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.DefaultJungle; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.Jungle; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTree; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultTreeEditor; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.DefaultTraverser; + +class SaxSample { + public static void main(String args[]) { + try { + /* + * パーサのFactoryを作成 名前からしてFactoryパターンで,Singletonだと思う. + */ + SAXParserFactory saxParserFactory = SAXParserFactory.newInstance(); + /* パーサを取得 */ + SAXParser saxParser = saxParserFactory.newSAXParser(); + Jungle jungle = new DefaultJungle(null, "hoge",new DefaultTreeEditor(new DefaultTraverser())); + JungleTree tree = jungle.createNewTree("XMLTEST"); + /* イベントハンドラを作成 */ + ReadXmlHandler readXmlHandler = new ReadXmlHandler(tree); + saxParser.parse(new FileInputStream("/Users/e115731/workspace/aaa/xml/Person.xml"), readXmlHandler); + } catch (Exception e) { + e.printStackTrace(); + } + } +} \ No newline at end of file diff -r 000000000000 -r faedeec97605 src/test/java/jp/ac/u_ryukyu/cr/ie/tatsuki/xmlReadTest/SaxTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jp/ac/u_ryukyu/cr/ie/tatsuki/xmlReadTest/SaxTest.java Fri Oct 24 07:29:40 2014 +0900 @@ -0,0 +1,104 @@ +package jp.ac.u_ryukyu.cr.ie.tatsuki.xmlReadTest; + +import java.io.*; +import java.nio.ByteBuffer; +import java.util.Iterator; + +import javax.xml.parsers.*; + +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.DefaultJungle; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.Jungle; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTree; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultTreeEditor; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.DefaultTraverser; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.InterfaceTraverser; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Pair; +import junit.framework.Assert; + +class SaxTest { + public static void main(String args[]) { + try { + /* + * パーサのFactoryを作成 名前からしてFactoryパターンで,Singletonだと思う. + */ + SAXParserFactory saxParserFactory = SAXParserFactory.newInstance(); + /* パーサを取得 */ + SAXParser saxParser = saxParserFactory.newSAXParser(); + Jungle jungle = new DefaultJungle(null, "hoge",new DefaultTreeEditor(new DefaultTraverser())); + JungleTree tree = jungle.createNewTree("XMLTEST"); + /* イベントハンドラを作成 */ + TestHandler testHandler = new TestHandler(tree); + + /* イベントハンドラに入力データとイベントハンドラを渡す */ + saxParser.parse(new FileInputStream("/Users/e115731/workspace/aaa/xml/sample.xml"), testHandler); + JungleTree newTree = testHandler.getTree(); + InterfaceTraverser ifTraverser = newTree.getTraverser(); + + Iterator> searchNode = ifTraverser.find(( + TreeNode node) -> { + ByteBuffer attribute = node.getAttributes().get("element"); + if (attribute != null) { + byte[] byteAttribute = attribute.array(); + String str = new String(byteAttribute); + System.out.println("attribute = " + str); + return str.equals("Person"); + } + return false; + }, "element", "Person"); + Pair nodePair = searchNode.next(); + Assert.assertEquals(nodePair.left().getAttributes().getString("element"),"Person"); + Assert.assertEquals(nodePair.right().toString(), "<-1,0>"); + + + searchNode = ifTraverser.find((TreeNode node) -> { + ByteBuffer attribute = node.getAttributes().get("element"); + if (attribute != null) { + byte[] byteAttribute = attribute.array(); + String str = new String(byteAttribute); + System.out.println("attribute = " + str); + return str.equals("name"); + } + return false; + }, "element", "name"); + + nodePair = searchNode.next(); + Assert.assertEquals(nodePair.left().getAttributes().getString("text"),"tatsuki"); + Assert.assertEquals(nodePair.right().toString(), "<-1,0,0>"); + + searchNode = ifTraverser.find((TreeNode node) -> { + ByteBuffer attribute = node.getAttributes().get("text"); + if (attribute != null) { + byte[] byteAttribute = attribute.array(); + String str = new String(byteAttribute); + System.out.println("attribute = " + str); + return str.equals("tatsuki"); + } + return false; + }, "text", "tatsuki"); + + nodePair = searchNode.next(); + Assert.assertEquals(nodePair.left().getAttributes().getString("id"),"10"); + Assert.assertEquals(nodePair.right().toString(), "<-1,0,0>"); + + searchNode = ifTraverser.find((TreeNode node) -> { + ByteBuffer attribute = node.getAttributes().get("id"); + if (attribute != null) { + byte[] byteAttribute = attribute.array(); + String str = new String(byteAttribute); + System.out.println("attribute = " + str); + return str.equals("10"); + } + return false; + }, "id", "10"); + + nodePair = searchNode.next(); + Assert.assertEquals(nodePair.left().getAttributes().getString("id"),"10"); + Assert.assertEquals(nodePair.right().toString(), "<-1,0,0>"); + + } catch (Exception e) { + e.printStackTrace(); + } + } +} \ No newline at end of file diff -r 000000000000 -r faedeec97605 src/test/java/jp/ac/u_ryukyu/cr/ie/tatsuki/xmlReadTest/TestHandler.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jp/ac/u_ryukyu/cr/ie/tatsuki/xmlReadTest/TestHandler.java Fri Oct 24 07:29:40 2014 +0900 @@ -0,0 +1,125 @@ +package jp.ac.u_ryukyu.cr.ie.tatsuki.xmlReadTest; + +import java.nio.ByteBuffer; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTree; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTreeEditor; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNodePath; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Pair; + +import org.xml.sax.*; +import org.xml.sax.helpers.*; + +class TestHandler extends DefaultHandler { + private JungleTree tree; + private JungleTreeEditor editor; + private NodePath path; + + public TestHandler(JungleTree tree){ + this.tree = tree; + this.editor = tree.getTreeEditor(); + this.path = new DefaultNodePath().add(-1); + } + + @Override + public void startElement(String uri, String localName,String qName, Attributes attributes) { + Pair nodePair = path.last(); + path = nodePair.right(); + int num = nodePair.left() + 1; + + Either either = editor.addNewChildAt(path, num); + if (either.isA()) { + //error + } + this.editor = either.b(); + + path = path.add(num); + System.out.println(path.toString()); + + + if (uri != "") { + System.out.println("namespaceURI= " + uri); + } + + if (localName != "") { + System.out.println("localName= " + localName); + } + + if (qName != "") { + System.out.println("qName= " + qName); + Either newEither = editor.putAttribute(path, "element", ByteBuffer.wrap(qName.getBytes())); + if (newEither.isA()) { + //error + } + this.editor = newEither.b(); + } + + if (attributes.getLength() != 0) { + for (int count = 0 ;attributes.getLength() > count; count++) { + System.out.println(attributes.getLocalName(count) + " = " + attributes.getValue(count)); + Either newEither = editor.putAttribute(path,attributes.getLocalName(count) , ByteBuffer.wrap(attributes.getValue(count).getBytes())); + if (newEither.isA()) { + //error + } + this.editor = newEither.b(); + } + } + path = path.add(-1); + } + + @Override + public void characters(char[] ch, int start, int length) { + String str = new String(ch, start, length); + Pattern pattern = Pattern.compile("\n"); + Matcher macher = pattern.matcher(str); + + if (!macher.find()) { + Pair nodePair = path.last(); + NodePath onePath = nodePair.right(); + Either newEither = editor.putAttribute(onePath, "text", ByteBuffer.wrap(str.getBytes())); + if (newEither.isA()) { + //error + } + this.editor = newEither.b(); + } + } + + @Override + public void endElement(String namespaceURI, String localName, String qName) { + path = path.tail(); + if (namespaceURI != "") { + System.out.println("namespaceURI= " + namespaceURI); + } + if (localName != "") { + System.out.println("localName= " + localName); + } + + if (qName != "") { + System.out.println("qName= " + qName); + } + } + + @Override + public void startDocument() { + System.out.println("start"); + } + + @Override + public void endDocument() { + Either either = editor.success(); + if (either.isA()) { + //error + } + System.out.println("end"); + } + + public JungleTree getTree(){ + return tree; + } + +} \ No newline at end of file