将元素添加到 java 中的 xml 文件而不将其加载到内存中
Add elements to xml file in java without loading it into memory
我有一个应用程序可以生成包含元素列表的非常大的 xml 文件,我必须分几步向其中添加元素并将它们保存在硬盘上。例如,在第一次迭代中将生成完整的文件:
<File>
<Header>
<Date>yyyy-MM-dd</Date>
<Uuid>335773a6-1ee3-4ef8-95dd-65abed4226b4 </Uuid>
<!-- Other params -->
</Header>
<Body>
<!-- Other params -->
<Users>
<User>
<Id>1</Id>
<Name>John</Name>
<Surname>Doe</Surname>
<Mail>john@mail.com</Mail>
<!-- Other params -->
</User>
<User>
<Id>2</Id>
<Name>John</Name>
<Surname>Doe</Surname>
<Mail>john@mail.com</Mail>
<!-- Other params -->
</User>
<!-- Add more items here-->
</Users>
</Body>
</File>
在接下来的迭代中添加了更多元素(在示例中只有两个用户):
<File>
<Header>
<Date>yyyy-MM-dd</Date>
<Uuid>335773a6-1ee3-4ef8-95dd-65abed4226b4 </Uuid>
<!-- Other params -->
</Header>
<Body>
<!-- Other params -->
<Users>
<User>
<Id>1</Id>
<Name>John</Name>
<Surname>Doe</Surname>
<Mail>john@mail.com</Mail>
<!-- Other params -->
</User>
<User>
<Id>2</Id>
<Name>John</Name>
<Surname>Doe</Surname>
<Mail>john@mail.com</Mail>
<!-- Other params -->
</User>
<User>
<Id>3</Id>
<Name>John</Name>
<Surname>Doe</Surname>
<Mail>john@mail.com</Mail>
<!-- Other params -->
</User>
<User>
<Id>4</Id>
<Name>John</Name>
<Surname>Doe</Surname>
<Mail>john@mail.com</Mail>
<!-- Other params -->
</User>
<!-- Add more items here-->
</Users>
</Body>
</File>
由于文件可能很长,我想避免内存问题,我可以在正确的位置添加新元素而不将文件完全加载到内存中吗?
您可能正在寻找 XML Streaming API。
一种解决方案是将您的文档维护为两个文件:一个大纲文件
<File>
<Header>
<Date>yyyy-MM-dd</Date>
<Uuid>335773a6-1ee3-4ef8-95dd-65abed4226b4 </Uuid>
<!-- Other params -->
</Header>
<Body>
<!-- Other params -->
<Users>
&users;
</Users>
</Body>
</File>
和有效负载文件:
<User>
<Id>1</Id>
<Name>John</Name>
<Surname>Doe</Surname>
<Mail>john@mail.com</Mail>
<!-- Other params -->
</User>
<User>
<Id>2</Id>
<Name>John</Name>
<Surname>Doe</Surname>
<Mail>john@mail.com</Mail>
<!-- Other params -->
</User>
然后您可以简单地附加到负载文件。大纲文件需要在其 DTD 中声明实体引用 &users;
。每当您使用符合规范的 XML 解析器读取大纲文件时,有效负载文件将被自动拉入。
这在 Javascript 等不支持 XML 外部实体的环境中不起作用。某些站点还具有防止使用外部实体的安全设置。
我有一个应用程序可以生成包含元素列表的非常大的 xml 文件,我必须分几步向其中添加元素并将它们保存在硬盘上。例如,在第一次迭代中将生成完整的文件:
<File>
<Header>
<Date>yyyy-MM-dd</Date>
<Uuid>335773a6-1ee3-4ef8-95dd-65abed4226b4 </Uuid>
<!-- Other params -->
</Header>
<Body>
<!-- Other params -->
<Users>
<User>
<Id>1</Id>
<Name>John</Name>
<Surname>Doe</Surname>
<Mail>john@mail.com</Mail>
<!-- Other params -->
</User>
<User>
<Id>2</Id>
<Name>John</Name>
<Surname>Doe</Surname>
<Mail>john@mail.com</Mail>
<!-- Other params -->
</User>
<!-- Add more items here-->
</Users>
</Body>
</File>
在接下来的迭代中添加了更多元素(在示例中只有两个用户):
<File>
<Header>
<Date>yyyy-MM-dd</Date>
<Uuid>335773a6-1ee3-4ef8-95dd-65abed4226b4 </Uuid>
<!-- Other params -->
</Header>
<Body>
<!-- Other params -->
<Users>
<User>
<Id>1</Id>
<Name>John</Name>
<Surname>Doe</Surname>
<Mail>john@mail.com</Mail>
<!-- Other params -->
</User>
<User>
<Id>2</Id>
<Name>John</Name>
<Surname>Doe</Surname>
<Mail>john@mail.com</Mail>
<!-- Other params -->
</User>
<User>
<Id>3</Id>
<Name>John</Name>
<Surname>Doe</Surname>
<Mail>john@mail.com</Mail>
<!-- Other params -->
</User>
<User>
<Id>4</Id>
<Name>John</Name>
<Surname>Doe</Surname>
<Mail>john@mail.com</Mail>
<!-- Other params -->
</User>
<!-- Add more items here-->
</Users>
</Body>
</File>
由于文件可能很长,我想避免内存问题,我可以在正确的位置添加新元素而不将文件完全加载到内存中吗?
您可能正在寻找 XML Streaming API。
一种解决方案是将您的文档维护为两个文件:一个大纲文件
<File>
<Header>
<Date>yyyy-MM-dd</Date>
<Uuid>335773a6-1ee3-4ef8-95dd-65abed4226b4 </Uuid>
<!-- Other params -->
</Header>
<Body>
<!-- Other params -->
<Users>
&users;
</Users>
</Body>
</File>
和有效负载文件:
<User>
<Id>1</Id>
<Name>John</Name>
<Surname>Doe</Surname>
<Mail>john@mail.com</Mail>
<!-- Other params -->
</User>
<User>
<Id>2</Id>
<Name>John</Name>
<Surname>Doe</Surname>
<Mail>john@mail.com</Mail>
<!-- Other params -->
</User>
然后您可以简单地附加到负载文件。大纲文件需要在其 DTD 中声明实体引用 &users;
。每当您使用符合规范的 XML 解析器读取大纲文件时,有效负载文件将被自动拉入。
这在 Javascript 等不支持 XML 外部实体的环境中不起作用。某些站点还具有防止使用外部实体的安全设置。