递归xml解析并获取数据java

时间:2013-03-23 17:30:35

标签: java xml parsing xml-parsing playframework-2.0

美好的一天! 我找不到普通算法来paars xml并为我的entety获取数据。 所以我有这样的xml:

    <?xml version="1.0" encoding="UTF-8"?>
<export>
    <categories>
        <category>
            <idgr xmlns:type="string">bd72d90d-55bc-11d9-848a-00112f43529a</idgr>
            <namegr xmlns:type="string">Обувь</namegr>
            <categories>
                <category>
                    <idgr xmlns:type="string">bd72d90e-55bc-11d9-848a-00112f43529a</idgr>
                    <namegr xmlns:type="string">Женская обувь</namegr>
                    <categories>
                        <category>
                            <idgr xmlns:type="string">bd72d910-55bc-11d9-848a-00112f43529a</idgr>
                            <namegr xmlns:type="string">Женские ботфорты коричневые</namegr>
                        </category>
                        <category>
                            <idgr xmlns:type="string">bd72d913-55bc-11d9-848a-00112f43529a</idgr>
                            <namegr xmlns:type="string">Ботинки женские демисезонные</namegr>
                        </category>
                        <category>
                            <idgr xmlns:type="string">bd72d916-55bc-11d9-848a-00112f43529a</idgr>
                            <namegr xmlns:type="string">Ботинки женские натуральная кожа</namegr>
                        </category>
                        <category>
                            <idgr xmlns:type="string">bd72d91b-55bc-11d9-848a-00112f43529a</idgr>
                            <namegr xmlns:type="string">Женские босоножки</namegr>
                        </category>
                        <category>
                            <idgr xmlns:type="string">dee6e178-55bc-11d9-848a-00112f43529a</idgr>
                            <namegr xmlns:type="string">Женские модельные туфли</namegr>
                        </category>
                        <category>
                            <idgr xmlns:type="string">dee6e17b-55bc-11d9-848a-00112f43529a</idgr>
                            <namegr xmlns:type="string">Женские сапоги с искусственным мехом</namegr>
                        </category>
                        <category>
                            <idgr xmlns:type="string">e8a71f9a-55bc-11d9-848a-00112f43529a</idgr>
                            <namegr xmlns:type="string">Женские туфли-мокасины</namegr>
                        </category>
                        <category>
                            <idgr xmlns:type="string">e8a71fa7-55bc-11d9-848a-00112f43529a</idgr>
                            <namegr xmlns:type="string">Женские сапоги с натуральным мехом</namegr>
                        </category>
                        <category>
                            <idgr xmlns:type="string">e8a71fa9-55bc-11d9-848a-00112f43529a</idgr>
                            <namegr xmlns:type="string">Сапоги жен. низкие</namegr>
                        </category>
                        <category>
                            <idgr xmlns:type="string">e8a71faf-55bc-11d9-848a-00112f43529a</idgr>
                            <namegr xmlns:type="string">Сапоги жен высокие</namegr>
                        </category>
                        <category>
                            <idgr xmlns:type="string">e8a71fb3-55bc-11d9-848a-00112f43529a</idgr>
                            <namegr xmlns:type="string">Женские туфли</namegr>
                        </category>
                        <category>
                            <idgr xmlns:type="string">e8a71fb7-55bc-11d9-848a-00112f43529a</idgr>
                            <namegr xmlns:type="string">Полусапожки на шнурках</namegr>
                        </category>
                    </categories>
                </category>
                <category>
                    <idgr xmlns:type="string">dee6e186-55bc-11d9-848a-00112f43529a</idgr>
                    <namegr xmlns:type="string">Мужская обувь</namegr>
                    <categories>
                        <category>
                            <idgr xmlns:type="string">dee6e187-55bc-11d9-848a-00112f43529a</idgr>
                            <namegr xmlns:type="string">Мужские мокасины</namegr>
                        </category>
                        <category>
                            <idgr xmlns:type="string">dee6e18a-55bc-11d9-848a-00112f43529a</idgr>
                            <namegr xmlns:type="string">Мужские ботинки демисезонные</namegr>
                        </category>
                        <category>
                            <idgr xmlns:type="string">e8a71fab-55bc-11d9-848a-00112f43529a</idgr>
                            <namegr xmlns:type="string">Мужские сапоги с натуральным мехом</namegr>
                        </category>
                        <category>
                            <idgr xmlns:type="string">e8a71fad-55bc-11d9-848a-00112f43529a</idgr>
                            <namegr xmlns:type="string">Мужские туфли нубук</namegr>
                        </category>
                        <category>
                            <idgr xmlns:type="string">e8a71fb1-55bc-11d9-848a-00112f43529a</idgr>
                            <namegr xmlns:type="string">Мужские сапоги с искуственным мехом</namegr>
                        </category>
                        <category>
                            <idgr xmlns:type="string">e8a71fb5-55bc-11d9-848a-00112f43529a</idgr>
                            <namegr xmlns:type="string">Ботинки мужские</namegr>
                        </category>
                    </categories>
                </category>
                <category>
                    <idgr xmlns:type="string">dee6e1cf-55bc-11d9-848a-00112f43529a</idgr>
                    <namegr xmlns:type="string">Кроссовки</namegr>
                    <categories>
                        <category>
                            <idgr xmlns:type="string">dee6e1d0-55bc-11d9-848a-00112f43529a</idgr>
                            <namegr xmlns:type="string">Кроссовки "ADIDAS"</namegr>
                        </category>
                        <category>
                            <idgr xmlns:type="string">dee6e1d3-55bc-11d9-848a-00112f43529a</idgr>
                            <namegr xmlns:type="string">Кроссовки "REEBOK"</namegr>
                        </category>
                        <category>
                            <idgr xmlns:type="string">dee6e1d6-55bc-11d9-848a-00112f43529a</idgr>
                            <namegr xmlns:type="string">Кроссовки высокие нат. кожа</namegr>
                        </category>
                        <category>
                            <idgr xmlns:type="string">dee6e1d9-55bc-11d9-848a-00112f43529a</idgr>
                            <namegr xmlns:type="string">Кроссовки мужские, кожа</namegr>
                        </category>
                    </categories>
                </category>
                <category>
                    <idgr xmlns:type="string">05e26d88-01e4-11dc-a411-00055d80a2d1</idgr>
                    <namegr xmlns:type="string">Аксессуары</namegr>
                    <categories>
                        <category>
                            <idgr xmlns:type="string">05e26d89-01e4-11dc-a411-00055d80a2d1</idgr>
                            <namegr xmlns:type="string">Крем для обуви</namegr>
                        </category>
                        <category>
                            <idgr xmlns:type="string">05e26d8b-01e4-11dc-a411-00055d80a2d1</idgr>
                            <namegr xmlns:type="string">Щетка для обуви</namegr>
                        </category>
                    </categories>
                </category>
            </categories>
        </category>
</categories>
</export>

(对不起代码中的俄文) 我试着解析它

public class ParseXmlData {
    public final static String FILE_PATH = "public/1cimport/export.xml";
    private DocumentBuilderFactory dbfactory;
    private DocumentBuilder documentBuilder;
    private Document doc;

    public final static String CATEGORIES_LABEL = "categories";

    private Integer levelCounter = 0;
    public ParseXmlData(){
        File xmlFile = new File(FILE_PATH);

        dbfactory = DocumentBuilderFactory.newInstance();
        try {
            documentBuilder = dbfactory.newDocumentBuilder();
            doc = documentBuilder.parse(FILE_PATH);
            final List<String> l  = new ArrayList<String>();

            parse(doc, l, doc.getDocumentElement());
        } catch (Exception e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }


    }
    public void parse(final Document doc, final List<String> list, final Element element){

        final NodeList nodeChildrenList = element.getChildNodes();

        for(int i = 0; i<nodeChildrenList.getLength(); i++){
            final Node node = nodeChildrenList.item(i);
            if(node.getNodeType() == Node.ELEMENT_NODE){
               list.add(node.getNodeName());
               if(node.getNodeName().toUpperCase().equals(ParseXmlData.CATEGORIES_LABEL.toUpperCase())){
                   CategoryParseXml categoryParseXml = new CategoryParseXml();
                   categoryParseXml.parseCategory(doc,list,(Element) node);
               }
               parse(doc,list,(Element) node);
            }
        }

    }
}

另一个班级

public class CategoryParseXml {
    public static Integer levelCounter = 0;
    public final static String IDGR_LABEL = "IDGR";
    public final static String NAMEGR_LABEL = "NAMEGR";

    private List<CategoryEntity> categoryEntities = new ArrayList<CategoryEntity>();

    public void parseCategory(final Document doc, final List<String> list, final Element element){
        final NodeList nodeChildrenList = element.getChildNodes();

        CategoryEntity categoryEntity = new CategoryEntity();
        categoryEntity.setLevel(levelCounter);

        for(int i = 0; i<nodeChildrenList.getLength(); i++){
            final Node node = nodeChildrenList.item(i);
            if(node.getNodeType() == Node.ELEMENT_NODE){
                list.add(node.getNodeName());
                if(node.getNodeName().toUpperCase().equals(ParseXmlData.CATEGORIES_LABEL.toUpperCase())){
                    CategoryParseXml.levelCounter++;
                    parseCategory(doc,list,(Element) node);
                }
                if(node.getNodeName().toUpperCase().equals(CategoryParseXml.IDGR_LABEL.toUpperCase())){
                    categoryEntity.setCategoryId(node.getNodeValue());
                }
                if(node.getNodeName().toUpperCase().equals(CategoryParseXml.NAMEGR_LABEL.toUpperCase())){
                    categoryEntity.setName(node.getNodeValue());
                }

                parseCategory(doc,list,(Element) node);
            }
        }

    }

}

我使用play框架和ebean作为ORM支持。 所以实体看起来像

@Entity
public class CategoryEntity extends Model {
    @Id
    private String categoryId;

    private String Name;
@OneToMany(targetEntity = CategoryEntity.class, cascade = CascadeType.ALL)
private List<CategoryEntity> categories;
    private Integer level;
}

我无法找到需要获取子类别列表的时刻以及何时需要创建并添加到类别。 请给我一些想法,从这个xml中填充这个类实体

1 个答案:

答案 0 :(得分:0)

如果我是你,我会尝试不同的方法:

  1. 创建支持递归的XSD架构请参阅此Recursion in an XML schema?
  2. 从xsd架构开始,使用JAXB创建可以序列化为XML并从XML反序列化的类也可以看到JAXB endless data structure, recursive binding?
  3. 我不推荐它,但您可以注释与JPA实体相同的JAXB生成的类,并直接使用它们进行持久化。另一种方法是为JPA实体创建不同的分隔类,并使用反射在JPA和JAXB类之间移动值