有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

javaaspose数据集。readXml生成更复杂的结构

所以我检查了Java的例子,注意到这个例子使用了来自https://github.com/aspose-words/Aspose.Words-for-Java/tree/master/Examples/srcInTableList.doc/InTableList

Aspose代码

他们正在公共空间中手动创建数据集。java文件。 代码的小部分摘录:

// Create a new data set
        DataSet ds = new DataSet("ds");

        // Add a new table to store contracts
        DataTable dtContracts = new DataTable("Contracts");

        // Add a new table to store managers
        DataTable dtManagers = new DataTable("Managers");

        // Add a new table to store clients
        DataTable dtClients = new DataTable("Clients");

        // Add columns to Managers table
        dtManagers.getColumns().add("Id", int.class);
        dtManagers.getColumns().add("Name");
        dtManagers.getColumns().add("Age", int.class);
        dtManagers.getColumns().add("Photo", byte[].class);
        ds.getTables().add(dtManagers);

        // Add columns to Contracts table
        dtContracts.getColumns().add("Id", int.class);
        dtContracts.getColumns().add("ClientId", int.class);
        dtContracts.getColumns().add("ManagerId", int.class);
        dtContracts.getColumns().add("Price", float.class);
        dtContracts.getColumns().add("Date", Date.class);
        ds.getTables().add(dtContracts);

        // Add columns to Clients table
        dtClients.getColumns().add("Id", int.class);
        dtClients.getColumns().add("Name");
        ds.getTables().add(dtClients);
        ds.getRelations().add(dtClients,dtContracts, "Id","ClientId");
        ds.getRelations().add(dtManagers,dtContracts, "Id","ManagerId");

单词模板是这样的:

<<foreach [m in ds.Managers]>><<[m.Name]>>  <<[m.Contracts.sum(
c => c.Price)]>><</foreach>>

Total:  <<[ds.Contracts.
sum(
c => c.Price)]>>

这看起来很简单,不需要根节点

我的代码

我有以下XML结构:

<root>
    <reference>b</reference>
    <caseHandler>
        <fullName>dddd</fullName>
        <active>true</active>
    </caseHandler>
    <name>This is the name of the case</name>
    <deadline>1528220937444</deadline>
    <associated>
        <code>ddd</code>
        <active>true</active>
        <id>-9</id>
        <parentScopeId>-3</parentScopeId>
        <title>ddddddddddd</title>
    </associated>
    <associated>
        <code>ddd</code>
        <active>true</active>
        <id>-9</id>
        <parentScopeId>-3</parentScopeId>
        <title>ddddddddddd</title>
    </associated>
</root>

我将XML加载到数据集中,如下所示:

DataSet set = new DataSet("ds");
set.readXml(new ByteArrayInputStream(escaped.getBytes()));

log.info("XML " + otherXml);

ReportingEngine engine = new ReportingEngine();
engine.buildReport(doc, set);//model

问题

基础报表坚持所有内容都在“根”节点下。 显然,这是<root>xml标记。 我如何修改我的设置来摆脱这个额外的级别

我的问题是,我需要用一个与这个“根”相关的“foreach”来包围word文件中的所有文本

<<foreach [c in root]>> 

<< [c.name] >> << [c.reference] >>

Case Handler : 
<< [c.caseHandler.first().fullName] >>


<<foreach [in c.associated]>>
    (<<[code]>>)    <<[title]>>                     <</foreach>>


 <</foreach>>

这很烦人

我当然更喜欢这样简单的东西:

 << [ds.name] >> << [ds.reference] >>

    Case Handler : 
    << [ds.caseHandler.first().fullName] >>


    <<foreach [in ds.associated]>>
        (<<[code]>>)    <<[title]>>                     <</foreach>>

问题:

如何简化结构,使我仍然能够读取XML,但不需要word文件中的额外开销


共 (2) 个答案

  1. # 1 楼答案

    是的,您可以从“名称”和“引用”字段中删除ds。在这种情况下,您需要使用ReportingEngine。buildReport(文档,对象[],字符串[])方法,如下所示

    模板:<&书信电报;[名称]>&燃气轮机<&书信电报;[参考]>&燃气轮机

    DataSet set = new DataSet("ds");
    set.readXml(MyDir + "in.xml");
    
    Document doc = new Document(MyDir + "template.docx");
    ReportingEngine engine = new ReportingEngine();
    engine.setOptions(ReportBuildOptions.ALLOW_MISSING_MEMBERS);
    engine.buildReport(doc, new Object[]{set.getTables().get("root").getRows().get(0), set}, new String[] {"", "ds"});//model
    doc.save(MyDir + "output.docx");
    
  2. # 2 楼答案

    请使用ReportingEngine。buildReport,如下所示,以获得所需的输出

    模板:<&书信电报;[ds.name]>&燃气轮机<&书信电报;[ds.参考]>&燃气轮机

    DataSet set = new DataSet("ds");
    set.readXml(MyDir + "in.xml");
    
    Document doc = new Document(MyDir + "template.docx");
    ReportingEngine engine = new ReportingEngine();
    engine.buildReport(doc, set.getTables().get("root").getRows().get(0), "ds");//model
    
    doc.save(MyDir + "output.docx");
    

    我与Aspose合作,担任开发人员宣传员