sale - proximo iphone 2019
¿Cómo puedo analizar este xml usando el analizador GDataXML? (4)
<list>
<OrderData HASH="1408108039"></OrderData>
<OrderData HASH="208524692">
<id>97</id>
<customer>
<CustomerData HASH="2128670187"></CustomerData></customer>
<billingAddress></billingAddress><deliveryAddress></deliveryAddress>
<orderDetail>
<list>
<OrderDetailData HASH="516790072"></OrderDetailData>
<OrderDetailData HASH="11226247"></OrderDetailData>
<OrderDetailData HASH="11226247"></OrderDetailData>
</list>
</orderDetail>
<log/>
</OrderData>
<OrderData HASH="1502226778"></OrderData>
</list>
No puedo encontrar una solución para encontrar la cantidad de elementos OrderDetailData
? También leo http://iphonebyradix.blogspot.com/2011/03/using-gdata-to-parse-xml-file.html esta url.
Gracias por adelantado.
Editar:
Estoy explicando mi requerimiento nuevamente. En este xml, habrá múltiples elementos OrderData
. Ahora tengo que contar el número de elementos OrderDetailData
de un elemento OrderData
particular. Supongamos que, según mi xml, el xml analizado actual tiene un elemento OrderData
, id
nombre y su valor es 97. Ahora, tengo que contar cuántos elementos OrderDetailData
están contenidos en el OrderData (which
id` es 97).
Si OrderDetailData está presente en el segundo objeto de la matriz todo el tiempo, puede utilizar el siguiente
NSArray* arr = [[XMLelement elementForName:@"list"] elementsForName:@"OrderData"];
NSXMLElement* listElement = [[[arr objectAtIndex:1] elementForName:@"orderDetail"] elementForName:@"list"];
NSArray* orderDetailArray* = [listElement elementsForName:@"OrderDetailData"];
En esto puede obtener los elementos OrderDetailData en la matriz, y puede analizar los datos en bucle. para obtener el uso de valor HASH.
NSString* hash = [[orderDetailArray objectAtIndex:0] stringValueForAttribute:@"HASH"];
Encontré que TouchXML es fácil de analizar y puede acceder directamente a los datos necesarios desde xml
Antes que nada, descargue TouchXML y agregue framework libxml2.dylib a su proyecto. cambie la compilación para "Ruta de búsqueda de encabezado" y agregue "/ usr / include / libxml2". Importe TouchXML.h a su archivo.
//Access document
CXMLDocument *parserDoc = [[CXMLDocument alloc] initWithContentsOfURL:url options:0 error:&err];
//Access root element and access children in heirarchy
CXMLElement *root = [parserDoc rootElement];
NSArray *places = [[[root children] objectAtIndex:0] children];
Más
//Access node by node
NSString *location =[[[[[parserDoc nodesForXPath:@"/xml_api_reply/weather/forecast_information/city" error:nil] objectAtIndex:0] attributeForName:@"data"] stringValue] retain];
Este es el código a continuación, lo he intentado. Obtuve la salida correcta ... echa un vistazo
NSString* xmlString = @"<?xml version=/"1.0/" encoding=/"UTF-8/"?>"
"<list>"
"<OrderData HASH=/"1408108039/"></OrderData>"
"<OrderData HASH=/"208524692/">"
"<id>97</id>"
"<customer>"
"<CustomerData HASH=/"2128670187/"></CustomerData></customer>"
"<billingAddress></billingAddress><deliveryAddress></deliveryAddress>"
"<orderDetail>"
"<list>"
"<OrderDetailData HASH=/"516790072/"></OrderDetailData>"
"<OrderDetailData HASH=/"11226247/"></OrderDetailData>"
"<OrderDetailData HASH=/"11226247/"></OrderDetailData>"
"</list>"
"</orderDetail>"
"<log/></OrderData>"
"<OrderData HASH=/"1502226778/"></OrderData>"
"</list>";
NSXMLDocument* doc = [[NSXMLDocument alloc] initWithData:[xmlString dataUsingEncoding:NSUTF8StringEncoding] options:0 error:nil];
NSXMLElement* rootElement = [doc rootElement];
NSArray* arr = [rootElement elementsForName:@"OrderData"];
NSXMLElement* orderDataElement;
for (int i = 0; i < [arr count]; i++)
{
int Id = 0;
Id = [[arr objectAtIndex:i] integerValueForNode:@"id"];
if (Id != 0)
{
orderDataElement = [arr objectAtIndex:i];
break;
}
}
NSArray* orderDetailArray = [[[orderDataElement elementForName:@"orderDetail"]
elementForName:@"list"]
elementsForName:@"OrderDetailData"];
for (int j = 0; j < [orderDetailArray count]; j++)
{
NSLog(@"%@", [[orderDetailArray objectAtIndex:j] stringValueForAttribute:@"HASH"]);
}
Este es un ejemplo simple de cómo recuperar algunos datos. Este ejemplo es muy simple y no utiliza la expresión XPath. Le sugiero que primero comprenda cómo funciona y luego use la expresión XPath. En mi opinión, no es útil usar la expresión XPath si no puede entender cómo funciona el analizador.
NSString* path = [[NSBundle mainBundle] pathForResource:@"test2" ofType:@"xml"];
NSData *xmlData = [[NSMutableData alloc] initWithContentsOfFile:path];
NSError *error;
GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:xmlData
options:0 error:&error];
//NSLog(@"%@", doc.rootElement); // print the whole xml
NSArray *orderDataArray = [doc.rootElement elementsForName:@"OrderData"];
for (GDataXMLElement *orderDataElement in orderDataArray) {
if([orderDataElement childCount] > 0)
{
NSString *attributeForOrderDataElement = [(GDataXMLElement *) [orderDataElement attributeForName:@"HASH"] stringValue];
NSLog(@"attributeForOrderDataElement has value %@", attributeForOrderDataElement);
GDataXMLElement* idElement = (GDataXMLElement*)[[orderDataElement elementsForName:@"id"] objectAtIndex:0];
NSLog(@"id has value %@", idElement.stringValue);
GDataXMLElement* orderDetailElement = (GDataXMLElement*)[[orderDataElement elementsForName:@"orderDetail"] objectAtIndex:0];
GDataXMLElement* listElement = (GDataXMLElement*)[[orderDetailElement elementsForName:@"list"] objectAtIndex:0];
NSArray* orderDetailDataArray = [listElement elementsForName:@"OrderDetailData"];
int count = 0;
for (GDataXMLElement *orderDetailDataElement in orderDetailDataArray) {
NSString *attributeForOrderDetailDataElement = [(GDataXMLElement *) [orderDetailDataElement attributeForName:@"HASH"] stringValue];
NSLog(@"attributeForOrderDetailDataElement has value %@", attributeForOrderDetailDataElement);
count++;
}
NSLog(@"%d", count);
}
}
[doc release];
[xmlData release];
Esta es la consola de salida:
attributeForOrderDataElement has value 208524692 <-- HASH value
id has value 97 <-- id value
attributeForOrderDetailDataElement has value 516790072 <-- HASH value
attributeForOrderDetailDataElement has value 11226247
attributeForOrderDetailDataElement has value 11226247
3 <-- the count
Espero eso ayude.
Editar
test2.xml contiene tu archivo, pero podrías pasarlo como una cadena. También puede pasar parámetros como una cadena como la siguiente:
NSString* xmlString = @"<list>"
"<OrderData HASH=/"1408108039/"></OrderData>"
"<OrderData HASH=/"208524692/">"
"<id>97</id>"
"<customer>"
"<CustomerData HASH=/"2128670187/"></CustomerData>"
"</customer>"
"<billingAddress></billingAddress>"
"<deliveryAddress></deliveryAddress>"
"<orderDetail>"
"<list>"
"<OrderDetailData HASH=/"516790072/"></OrderDetailData>"
"<OrderDetailData HASH=/"11226247/"></OrderDetailData>"
"<OrderDetailData HASH=/"11226247/"></OrderDetailData>"
"</list>"
"</orderDetail>"
"<log/>"
"</OrderData>"
"<OrderData HASH=/"1502226778/"></OrderData>"
"</list>";
GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithXMLString:xmlString options:0 error:&error];