установить ограничение на количество детей в элементе в xml

У меня есть файл XML следующим образом

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

Я использую jdom2 SAXBuilder для анализа xml в java. Мне нужно сохранить все недавно открытые файлы в <Recentlyopenedfiles>. Максимально это должно содержать только три пути (т.е. путь к 3 недавно открытым файлам).

Итак, мне нужно знать

  1. Есть ли какой-либо механизм для ограничения дочерних узлов?
  2. Как проиндексировать дочерний элемент и выполнить операцию стека, чтобы последний открытый файл сохранялся по первому пути.

Спасибо.


person user3131471    schedule 27.12.2013    source источник


Ответы (4)


Ответ Джона наиболее близок к тому, что я бы порекомендовал. Механика этого проще, чем кажется:

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);
person rolfl    schedule 27.12.2013

В XSD есть объявления для ограничения количества дочерних элементов, но я не думаю, что это актуально в вашем конкретном случае. Когда дело доходит до синтаксического анализа и последующего изменения XML, вам просто нужно выполнить ограничение вручную.

С точки зрения "наложения" - если вы всегда добавляете элементы в начало элемента, а не в конец (используя parent.addContent(0, newChild)), вы получите последний добавленный вами элемент, который будет первым. в документе. Затем вы можете подсчитать, сколько у вас есть, и удалить все лишние.

person Jon Skeet    schedule 27.12.2013

  1. Вы можете ограничить количество дочерних узлов, используя схему XSD и проверить свой XML-файл на это . Здесь вы можете найти как установить максимальное количество узлов.
  2. Вы можете использовать парсер DOM . Вы можете перебирать все узлы в XML на одном уровне и подсчитывать количество узлов «Файл».
  3. Если вам нужно проанализировать ОГРОМНЫЙ XML-файл, парсер DOM может не подойти. В этом случае лучше использовать парсер StAX. Просто посчитайте, сколько раз открывался тег «Файл», и обработайте случай, если он встречается более 3 раз.
person Ivan Mushketyk    schedule 27.12.2013

Установка ограничения на дочерние узлы. Предполагая, что вы не создаете 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>

Если вы затем добавляете элементы из кода, просто добавляйте их всегда сверху: используйте addContent с index = 0, как описано здесь

elem.addContent(0, newChild);
person aviad    schedule 27.12.2013