【问题标题】:Recursive xml parsing and get data java递归xml解析并获取数据java
【发布时间】:2013-03-13 11:05:19
【问题描述】:

美好的一天! 我找不到正常的算法来处理 xml 并为我的实体获取数据。 所以我有这样的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 framework 和 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 填充这个类实体

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2021-01-07
      • 1970-01-01
      • 1970-01-01
      • 2022-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-25
      相关资源
      最近更新 更多