سؤال

أنا أؤيد تطبيق Legacy C ++ الذي يستخدم Xerces-C للحصول على تحليل XML. لقد أفسد بواسطة .NET و AM اعتدت على استخدام XPath لتحديد العقد من شجرة دوم.

هل هناك أي طريقة للوصول إلى بعض وظائف XPath المحدودة في Xerces-C؟ أنا أبحث عن شيء مثل الخردلات ("/ ل / بار / باز"). يمكنني القيام بذلك يدويا، لكن XPath هو لطيف جدا بالمقارنة.

هل كانت مفيدة؟

المحلول

انظر الأسئلة الشائعة xerces.

http://xerces.apache.org/xerces-c/faq-22.html#FAQ-9.

هل يدعم Xerces-C ++ XPath؟ N.CERCES-C ++ 2.8.0 و Xerces-C ++ 3.0.1 لديها فقط تنفيذ XPath الجزئي لأغراض التعامل مع قيود هوية المخطط. للحصول على دعم XPath الكامل، يمكنك الرجوع Apache Xalan C ++ أو مشاريع أخرى مفتوحة المصدر مثل Pathan.

من السهل إلى حد ما أن تفعل ما تريد استخدام XALAN ولكن.

نصائح أخرى

هنا مثال عمل لتقييم XPath مع Xerces 3.1.2..

عينة xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<root>
    <ApplicationSettings>hello world</ApplicationSettings>
</root>

C ++.

#include <iostream>
#include <xercesc/dom/DOM.hpp>
#include <xercesc/dom/DOMDocument.hpp>
#include <xercesc/dom/DOMElement.hpp>
#include <xercesc/util/TransService.hpp>
#include <xercesc/parsers/XercesDOMParser.hpp>

using namespace xercesc;
using namespace std;

int main()
{
  XMLPlatformUtils::Initialize();
  // create the DOM parser
  XercesDOMParser *parser = new XercesDOMParser;
  parser->setValidationScheme(XercesDOMParser::Val_Never);
  parser->parse("sample.xml");
  // get the DOM representation
  DOMDocument *doc = parser->getDocument();
  // get the root element
  DOMElement* root = doc->getDocumentElement();

  // evaluate the xpath
  DOMXPathResult* result=doc->evaluate(
      XMLString::transcode("/root/ApplicationSettings"),
      root,
      NULL,
      DOMXPathResult::ORDERED_NODE_SNAPSHOT_TYPE,
      NULL);

  if (result->getNodeValue() == NULL)
  {
    cout << "There is no result for the provided XPath " << endl;
  }
  else
  {
    cout<<TranscodeToStr(result->getNodeValue()->getFirstChild()->getNodeValue(),"ascii").str()<<endl;
  }

  XMLPlatformUtils::Terminate();
  return 0;
}

تجميع وتشغيل (يفترض تثبيت مكتبة مكتبة Xerces القياسية وملف C ++ xpath.cpp.)

g++ -g -Wall -pedantic -L/opt/lib -I/opt/include -DMAIN_TEST xpath.cpp -o xpath -lxerces-c
./xpath

نتيجة

hello world

بحسب ال التعليمات, ، يدعم Xerces-C تنفيذ XPath 1 جزئي:

يتم توفير نفس المحرك من خلال Domdocument :: تقييم API للسماح للمستخدم بإجراء استعلامات XPath البسيطة التي تنطوي على عقد DomeLement فقط، مع عدم وجود اختبار مسند والسماح للمشغل "//" فقط كخطوة أولية.

انت تستخدم Domdocument :: تقييم () لتقييم التعبير، الذي يقوم بعد ذلك بإرجاع DomxPathResult..

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top