将限制设置为xml中元素中的子元素数

时间:2013-12-27 08:53:29

标签: java xml jdom

我有一个XML文件如下

<abc>
  <property>
    <Recentlyopenedfiles>
    <File Path="c:\hai.txt" />
    <File Path="C:\old.java" />
    </Recentlyopenedfiles>
   </property>
</abc>

我使用jdom2 SAXBuilder来解析java中的xml。我需要保存<Recentlyopenedfiles>中所有最近打开的文件。最多只需要保存三条路径(即)3最近打开的文件路径。

所以,我需要知道

  1. 是否有任何机制来设置子节点的限制?
  2. 如何索引子进程并执行堆栈操作以便最后打开文件 保存在第一个文件路径中。
  3. 感谢。

4 个答案:

答案 0 :(得分:4)

Jon的回答与我的建议最接近。它的mecahinics比它听起来更容易:

Document doc = saxbuilder.build(....);
Element abc = doc.getRootElement();
Element recentelement = abc.getChild("properties").getChild("Recentlyopenedfiles");
List<Element> recentfiles = recentelement.getChildren("File");
recentfiles.add(0, new Element("File").setAttribute("Path", filepath));
while (recentfiles.size() > 3) {
   recentfiles.remove(3);
}
XMLOutputter xout = new XMLOutputter(Format.getPrettyFormat());
xout.output(doc, outputstream);

答案 1 :(得分:2)

XSD中有声明限制子元素的数量,但我不认为这与您的特定情况相关。在解析然后修改XML时,您只需要手动执行限制。

就“堆叠”而言 - 如果您只是总是将项目添加到元素的开始而不是最后(使用parent.addContent(0, newChild)),那么您最终会得到你添加的最后一个是文档中的第一个。然后你可以计算你有多少,并删除任何额外的。

答案 2 :(得分:0)

  1. 您可以使用XSD schemavalidate对您的XML文件限制子节点数。 Here您可以找到如何设置最大节点数。
  2. 您可以使用DOM parser。您可以在同一级别上迭代XML中的所有节点,并计算&#34; File&#34;节点。
  3. 如果您需要解析HUGE XML文件,那么DOM解析器可能不合适。在这种情况下,StAX解析器可能是更好的选择。只计算次数&#34;文件&#34;发生了打开标签,如果发生超过3次,则处理一个案例。

答案 3 :(得分:0)

设置子节点的限制。假设您没有创建解析的XML,可以定义模式中的子元素数(XSD)

类似的东西:

<xs:element name="pets">
  <xs:complexType>
    <xs:sequence minOccurs="0" maxOccurs="unbounded">
      <xs:element name="dog" type="xs:string"/>
      <xs:element name="cat" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

如果您然后添加代码中的元素,那么只需将它们添加到顶部: 如描述here

,使用带有index = 0的addContent
elem.addContent(0, newChild);