0

良い一日!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);
            }
        }

    }

}

私は ORM サポートとして play フレームワークと eBean を使用しています。エンティティは次のようになります

@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からこのクラスエンティティを埋めるためのアイデアを教えてください

4

1 に答える 1

0

私があなただったら、別のアプローチを試します。

  1. 再帰をサポートする XSD スキーマを作成する XML スキーマでの再帰を参照してください。
  2. その xsd スキーマから JAXB を使用して、XML にシリアライズし、XML からデシリアライズできるクラスを作成します。これも参照してください。JAXB 無限データ構造、再帰バインディング?
  3. お勧めしませんが、同じ JAXB 生成クラスに JPA エンティティとしてアノテーションを付けて、永続化のために直接使用できます。別のアプローチは、JPA エンティティ用に別々のクラスを作成し、たとえばリフレクションを使用して JPA クラスと JAXB クラスの間で値を移動することです。
于 2013-03-23T17:48:31.977 に答える