2011-01-14 13 views
16

Ben bir xml dosyasından tam bir dom oluşturmayı biliyorum bir dosyanın bir dize ayrıştırmak yapma:Xerces yerine XercesDOMParser kullanılarak

xercesc::XercesDOMParser parser = new xercesc::XercesDOMParser(); 
parser->parse(path_to_my_file); 
parser->getDocument(); // From here on I can access all nodes and do whatever i want 

Eh, çalışır ... ama ne isteyeyim eğer bir dizeyi ayrıştırmak

std::string myxml = "<root>...</root>"; 
xercesc::XercesDOMParser parser = new xercesc::XercesDOMParser(); 
parser->parse(myxml); 
parser->getDocument(); // From here on I can access all nodes and do whatever i want 

gibi bir şey ben o ayrıştırma yöntemi ve aşırı versiyonları, sadece dosyaları ayrıştırmak bkz AbstractDOMParser içine bakıyor sürüm 3'ü kullanıyorum.

Dizgiden nasıl ayrışabilirim?

xercesc::MemBufInputSource myxml_buf(myxml.c_str(), myxml.size(), 
            "myxml (in memory)"); 
parser->parse(myxml_buf); 

cevap

18

bir MemBufInputSource ve parse oluşturma

MemBufInputSource src((const XMLByte*)myxml.c_str(), myxml.length(), "dummy", false); 
parser->parse(src); 
+1

Üzgünüm son parametre anlayamıyorum ... bu nedir ?? ?? – Andry

+4

Hata iletilerinde kullanılan "sahte sistem kimliği" ve "bu varlıktan göreceli yollar/URL'ler yoluyla atıfta bulunulan varlıklar, bu sahte sistem kimliğine göre olacaktır". API dokümanlarına bakın. –

+1

larsmanlar bana neden, kodunuzu kullanırken ve xml'i doğru şekilde yazdırırken Terminate() uyguladığımda uygulamamın Segmentation Fault'a devam ettiğini söyler misiniz ????? – Andry

11

XercesDOMParser aşağıdaki aşırı :: ayrıştırma() kullanın:

void XercesDOMParser::parse(const InputSource& source); 

it a MemBufInputSource geçen:

+1

MemBufInputSource ve Wrapper4InputSource hangi ad alanında bulunduğunu nasıl anlarım? Xerces'te isim alanlarında ciddi bir sorun yaşıyorum. Ty – Silver

+2

'xercesc' ad alanı üzerindedir, ancak ayrıca #include ' seçeneğine de ihtiyacınız vardır. İki yıl geciktim ama aynı sorunu yaşadım ve bir başkası daha sonra tekrar alabilir. – VillasV

+0

Ayrıca gerekli dökümün belirtilmesi için +1. – VillasV

1

Im başka bir şekilde yapıyor. Bu yanlışsa, lütfen bana nedenini söyle. Çalışıyor gibi görünüyor. Bu ayrıştırma beklediği budur:

DOMDocument* DOMLSParser::parse(const DOMLSInput * source) 

Yani bir bir InputSource yerine DOMLSInput koymak gerekir:

xercesc::DOMImplementation * impl = xercesc::DOMImplementation::getImplementation(); 
xercesc::DOMLSParser *parser = (xercesc::DOMImplementationLS*)impl)->createLSParser(xercesc::DOMImplementation::MODE_SYNCHRONOUS, 0); 
xercesc::DOMDocument *doc; 

xercesc::Wrapper4InputSource source (new xercesc::MemBufInputSource((const XMLByte *) (myxml.c_str()), myxml.size(), "A name"); 
parser->parse(&source); 
+0

Bunun için teşekkürler. Bu cevap, gerçek [DOM Programlama Rehberi] 'ne daha yakın görünmektedir (https://xerces.apache.org/xerces-c/program-dom-3.html) – user23573

İlgili konular