문제

제공된 xml-document에 대한 스트리밍 XPath 표현식 평가를 위한 프로덕션 준비 라이브러리가 있습니까?내 조사에 따르면 대부분의 기존 솔루션은 xpath 표현을 평가하기 전에 전체 DOM 트리를 메모리에 로드하는 것으로 나타났습니다.

도움이 되었습니까?

해결책

XPath 구문이 다음을 허용한다는 점을 감안할 때 이것은 완전한 XPath 구현에 실용적입니까?

/AAA/XXX/following::*

그리고

/AAA/BBB/following-sibling::*

외관 요구 사항을 의미하는 것은 무엇입니까? 즉, 특정 노드에서 어쨌든 나머지 문서를로드해야합니다.

Doc nux 도서관 (특히 StreamingPathFilter)이 점을 제시하고 의존하는 일부 구현을 참조합니다. 서브 세트 XPath의. NUX는 일부 스트리밍 쿼리 기능을 수행한다고 주장하지만 위의 점에서 XPath 구현 측면에서 일부 제한 사항이 있습니다.

다른 팁

XSLT 3.0 제공 스트리밍 처리 모드 그리고 이것은 XSLT 3.0 W3C 사양이 W3C 권장 사항이되는 표준이 될 것입니다.

이 답변을 작성할 때 (2011 년 5 월) Saxon은 일부를 제공합니다. XSLT 3.0 스트리밍 지원 .

몇 가지 옵션이 있습니다:

  • DataDirect Technologies는 XQuery 구현을 판매합니다. 가능한 경우 프로젝션과 스트리밍을 사용합니다.수 기가바이트 범위의 파일을 처리할 수 있습니다.사용 가능한 메모리보다 큽니다.스레드로부터 안전한 라이브러리이므로 통합이 쉽습니다.자바 전용.

  • 색슨 족 일부 상황에서 스트리밍을 수행하는 적당한 가격의 더 비싼 사촌이 있는 오픈 소스 버전입니다.Java이지만 .net 포트도 있습니다.

  • 마크로직 그리고 존재하다 XML이 로드되면 상당히 지능적인 방식으로 XPath를 처리하는 XML 데이터베이스입니다.

노력하다 부 조스트.

실질적인 경험은 없지만 QuixProc을 언급 할 가치가 있다고 생각했습니다. http://code.google.com/p/quixproc/ ). XPROC에 대한 스트리밍 접근 방식이며 XPath에 대한 스트리밍 지원을 제공하는 라이브러리를 사용합니다.

FWIW, 나는 매우 큰 (> 3GB) 파일에 대해 NUX 스트리밍 필터 XPATH 쿼리를 사용했으며 완벽하게 작동하고 메모리가 거의 사용되지 않았습니다. 내 유스 케이스는 약간 다르지만 (유효성 검사 중심이 아님) Nux와 함께 촬영하는 것이 좋습니다.

맞춤 코드를 찾을 것 같아요. .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();
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top