java xml xml-parsing apex-code

Problemas básicos de análisis XML. No se pueden encontrar nombres de nodo a través del método Java XmlStreamReader. ¿Algunas ideas?



xml-parsing apex-code (1)

No tener suerte en el análisis de algunos XML básicos. Estoy haciendo esto en el lenguaje Apex , pero es sintácticamente casi idéntico a Java y en este caso usa java.xml.stream.XMLStreamReader como su motor de análisis XML.

El problema es: no tengo suerte para acceder a ninguno de los nombres de nodos XML reales. El método getLocalName () dentro de la clase XmlStreamReader siempre devuelve null para todos los nodos a medida que los recorro.

el código está aquí

Funcionalidad muy básica en este punto. Si ejecuta esto, verá que reader.getLocalName () siempre devuelve null y también lo hacen todos los métodos que lo acompañan (getNameSpace (), getLocation (), getPrefix ()).

¿Alguna idea de por qué? Estoy atrapado con el XML llegando en el formato en que está ... así que tengo que analizarlo tal como está. Podría usar varias soluciones (regEx, contar nodos, etc.) pero son desordenadas y no ideales.


He reformado tu código en un bloque que se puede probar en la ventana de ejecución anónima del banco de trabajo. Ejecuto el código y luego filtro el registro de ejecución para mostrar las instrucciones USER_DEBUG. El resultado muestra nombres de nodo y texto como es de esperar. Creo que la clave es usar los métodos APEX hasText () y hasName ().

String XML_STR = ''<document>'' + ''<result>success</result>'' +''<resultcode>000000</resultcode>'' + ''<note></note>'' + ''<item>'' +''<quantity>1</quantity>'' + ''<fname>Bob</fname>'' +''<lname>Tungsten</lname>'' + ''<address>23232 Fleet Street</address>'' +''<city>Santa Clara</city>'' + ''<state>CA</state>'' +''<zip>94105</zip>'' + ''<country>United States</country>'' +''<email>[email protected]</email>'' + ''<phone>4155555555</phone>'' +''</item>'' +''</document>''; XmlStreamReader reader = new XmlStreamReader(XML_STR); while (reader.hasNext()) { System.debug(''$$$ reader.getEventType(): '' + reader.getEventType()); if (reader.hasName()) { System.debug(''$$$ reader.getLocalName(): '' + reader.getLocalName()); // System.debug(''$$$ reader.getNamespace(): '' + reader.getNamespace()); // System.debug(''$$$ reader.getprefix(): '' + reader.getprefix()); } if (reader.hasText()) { System.debug(''$$$ reader.getText(): '' + reader.getText()); } System.debug(''$$$ Go to next''); reader.next(); }

Aquí hay otra solución basada en la receta de Jon Mountjoy http://developer.force.com/cookbook/recipe/parsing-xml-using-the-apex-dom-parser

private String walkThrough(DOM.XMLNode node) { String result = ''/n''; if (node.getNodeType() == DOM.XMLNodeType.COMMENT) { return ''Comment ('' + node.getText() + '')''; } if (node.getNodeType() == DOM.XMLNodeType.TEXT) { return ''Text ('' + node.getText() + '')''; } if (node.getNodeType() == DOM.XMLNodeType.ELEMENT) { result += ''Element: '' + node.getName(); if (node.getText().trim() != '''') { result += '', text='' + node.getText().trim(); } if (node.getAttributeCount() > 0) { for (Integer i = 0; i< node.getAttributeCount(); i++ ) { result += '', attribute #'' + i + '':'' + node.getAttributeKeyAt(i) + ''='' + node.getAttributeValue(node.getAttributeKeyAt(i), node.getAttributeKeyNsAt(i)); } } for (Dom.XMLNode child: node.getChildElements()) { result += walkThrough(child); } return result; } return ''''; //should never reach here } private String parse(String toParse) { DOM.Document doc = new DOM.Document(); try { doc.load(toParse); DOM.XMLNode root = doc.getRootElement(); return walkThrough(root); } catch (System.XMLException e) { // invalid XML return e.getMessage(); } } String XML_STR = ''<document>'' + ''<result>success</result>'' +''<resultcode>000000</resultcode>'' + ''<note></note>'' + ''<item>'' +''<quantity>1</quantity>'' + ''<fname>Bob</fname>'' +''<lname>Tungsten</lname>'' + ''<address>23232 Fleet Street</address>'' +''<city>Santa Clara</city>'' + ''<state>CA</state>'' +''<zip>94105</zip>'' + ''<country>United States</country>'' +''<email>[email protected]</email>'' + ''<phone>4155555555</phone>'' +''</item>'' +''</document>''; System.debug(parse(XML_STR));