Objective C - Parsing xml with namespaces using path

I am having a problem parsing the following xml data:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<encryption xmlns="urn:oasis:names:tc:opendocument:xmlns:container">
<EncryptedData xmlns="http://www.w3.org/2001/04/xmlenc#">
<EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes128-cbc"/>
<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
<resource xmlns="http://ns.nuts-for-africa.com/epubdrm">urn:uuid:7297037a-6a5e-4bb1-bfa3-9a683288adb5</resource>
</KeyInfo>
<CipherData>
<CipherReference URI="OPS/epubbooksinfo.html"/>
</CipherData>
</EncryptedData>
<EncryptedData xmlns="http://www.w3.org/2001/04/xmlenc#">
<EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes128-cbc"/>
<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
<resource xmlns="http://ns.nuts-for-africa.com/epubdrm">urn:uuid:7297037a-6a5e-4bb1-bfa3-9a683288adb5</resource>
</KeyInfo>
<CipherData>
<CipherReference URI="OPS/chapter-008.html"/>
</CipherData>
</EncryptedData>

      

I am using the following code: read the XML file and parse it. I've tried every xpath combination I could think of but couldn't get it to work:

NSData *encryptData = [self getResourceFileName:filename extension:fileext readFileInZip:@"encryption.xml"]; //this is a function to retrieve files from a zip file. This  is working
if(encryptData != nil){
    //http://www.w3.org/2001/04/xmlenc#
    CXMLDocument* cryptFile = [[CXMLDocument alloc] initWithData:encryptData options:0 error:nil];
    NSArray *encryptionItems = [cryptFile nodesForXPath:@"EncryptedData" namespaceMappings:[NSDictionary dictionaryWithObject:@"http://www.w3.org/2001/04/xmlenc#" forKey:@""] error:nil];
    for (CXMLElement* encEl in encryptionItems) {
        NSArray *uuidArray = [encEl nodesForXPath:@"KeyInfo/resource" namespaceMappings:nil error:nil];
        NSString *uuid = [[uuidArray objectAtIndex:0] stringValue];

        NSArray *fileArray = [encEl nodesForXPath:@"CipherData/CipherReference" namespaceMappings:nil error:nil];
        NSString *fileRef = [[fileArray objectAtIndex:0] stringValue];

        NSLog(@"File: %@ - UUID: %@",fileRef,uuid);

    }

} 

      

+3


source to share


2 answers


I am using CXMLDocuments and CXMLElements and just spent some time on a similar issue (Google KML files). Perhaps your problem is related to the namespacing issue. When you set up namespace mappings, specify the namespace and then prefix your selectors in XPath expressions with that key, followed by a colon (:). To start with a simple example, let's say your XML is:

<books xmlns="http://what.com/ever">
  <book>
    <title>Life of Pi</title>
  </book>
  <book>
    <title>Crime and Punishment</book>
  </book
</books>

      

You selected all books with:



// So, assuming you've already got the data for the XML document
CXMLDocument* xmldoc = [[CXMLDocument alloc] initWithData:xmlDocData options:0 error:nil];
NSDictionary *namespaceMappings = [NSDictionary dictionaryWithObjectsAndKeys:@"http://what.com/ever", @"nskey", nil];
NSError *error = nil;
NSArray *bookElements = [xmldoc nodesForXPath:@"/nskey:books/nskey:book" namespaceMappings:mappings error:&error];

      

Note that you need to prefix each element, not just the one where the namespace is declared. This is a pretty long XML namespaced document that you are dealing with, good luck.

0


source


It is a very simple XML parser to use.



http://www.tbxml.co.uk/TBXML/TBXML_Free.html

0


source







All Articles