Потоковая оценка XPath - PullRequest
       24

Потоковая оценка XPath

14 голосов
/ 15 июня 2009

Существуют ли готовые к работе библиотеки для потоковой обработки оценки выражений XPath по предоставленному xml-документу? Мои исследования показывают, что большинство существующих решений загружают все DOM-дерево в память перед оценкой выражения xpath.

Ответы [ 7 ]

4 голосов
/ 08 мая 2011

XSLT 3.0 обеспечивает потоковый режим обработки , и это станет стандартом, когда спецификация XSLT 3.0 W3C станет Рекомендацией W3C.

На момент написания этого ответа (май 2011 г.) Saxon предоставляет некоторую поддержку потоковой передачи XSLT 3.0 .

3 голосов
/ 15 июня 2009

Есть несколько вариантов:

  • DataDirect Technologies продает реализацию XQuery , которая по возможности использует проекцию и потоковую передачу. Он может обрабатывать файлы в диапазоне нескольких гигабайт - например, больше доступной памяти. Это поточно-ориентированная библиотека, поэтому ее легко интегрировать. Java-только.

  • Saxon - версия с открытым исходным кодом, с более дорогой кузиной по умеренной цене, которая в некоторых контекстах будет выполнять потоковую передачу. Java, но с портом .net также.

  • MarkLogic и eXist - это базы данных XML, которые, если в них загружен ваш XML, будут довольно разумно обрабатывать XPath.

3 голосов
/ 15 июня 2009

Будет ли это практичным для полной реализации XPath, учитывая, что синтаксис XPath допускает:

/AAA/XXX/following::*

и

/AAA/BBB/following-sibling::*

что подразумевает прогнозные требования? то есть с определенного узла вам все равно придется загружать остальную часть документа.

Документ для библиотеки Nux (в частности StreamingPathFilter ) подчеркивает это и ссылается на некоторые реализации, основанные на подмножестве XPath. Nux утверждает, что выполняет некоторые возможности потокового запроса, но, учитывая вышесказанное, будут некоторые ограничения с точки зрения реализации XPath.

1 голос
/ 01 декабря 2011

Хотя у меня нет практического опыта, я подумал, что стоит упомянуть QuiXProc (http://code.google.com/p/quixproc/). Это потоковый подход к XProc и использует библиотеки, которые обеспечивают потоковую поддержку XPath среди других ..

1 голос
/ 15 июня 2009

Попробуйте Joost .

0 голосов
/ 19 мая 2016

Я думаю, я пойду за пользовательский код. Библиотека .NET приближает нас к цели, если кто-то просто хочет прочитать некоторые пути документа xml.

Поскольку все решения, которые я вижу до сих пор, относятся только к подмножеству XPath, это тоже решение такого рода. Подмножество действительно небольшое, хотя. :)

Этот код C # читает файл xml и подсчитывает узлы по заданному пути. Вы также можете легко работать с атрибутами, используя синтаксис xr["attrName"].

  int c = 0;
  var r = new System.IO.StreamReader(asArgs[1]);
  var se = new System.Xml.XmlReaderSettings();
  var xr = System.Xml.XmlReader.Create(r, se);
  var lstPath = new System.Collections.Generic.List<String>();
  var sbPath = new System.Text.StringBuilder();
  while (xr.Read()) {
    //Console.WriteLine("type " + xr.NodeType);
    if (xr.NodeType == System.Xml.XmlNodeType.Element) {
      lstPath.Add(xr.Name);
    }

    // It takes some time. If 1 unit is time needed for parsing the file,
    // then this takes about 1.0.
    sbPath.Clear();
    foreach(object n in lstPath) {
      sbPath.Append('/');
      sbPath.Append(n);
    }
    // This takes about 0.6 time units.
    string sPath = sbPath.ToString();

    if (xr.NodeType == System.Xml.XmlNodeType.EndElement
        || xr.IsEmptyElement) {
      if (xr.Name == "someElement" && lstPath[0] == "main")
        c++;
      // And test simple XPath explicitly:
      // if (sPath == "/main/someElement")
    }

    if (xr.NodeType == System.Xml.XmlNodeType.EndElement
        || xr.IsEmptyElement) {
      lstPath.RemoveAt(lstPath.Count - 1);
    }
  }
  xr.Close();
0 голосов
/ 04 июля 2009

FWIW, я использовал запросы потокового фильтра Nux xpath для очень больших (> 3 ГБ) файлов, и оба они работали безупречно и использовали очень мало памяти. Мой вариант использования немного отличается (не ориентирован на валидацию), но я настоятельно рекомендую вам попробовать его с Nux.

...