java - 基本的 XML 解析问题。无法通过 Java XmlStreamReader 方法找到节点名称。有任何想法吗?

标签 java xml xml-parsing apex-code

无法解析一些基本的 XML。我正在 Apex language 中执行此操作,但它在语法上几乎与 Java 相同,在本例中使用 java.xml.stream.XMLStreamReader作为其 XML 解析引擎。

问题是:我没有运气获得任何实际的 XML 节点名称。当我循环访问所有节点时,XmlStreamReader 类中的 getLocalName() 方法始终返回 null。

code is here

此时的功能非常基本。如果运行此命令,您将看到 reader.getLocalName() 始终返回 null,所有附带方法(getNameSpace()、getLocation()、getPrefix())也是如此。

有什么想法吗?我对 XML 的格式感到困惑......所以我必须按原样解析它。我可以使用各种解决方法(正则表达式、计数节点等),但这些方法很困惑且不理想。

最佳答案

我已将您的代码重组为一个 block ,可以在工作台的匿名执行窗口中进行测试。我运行代码,然后过滤执行日志以显示 USER_DEBUG 语句。输出显示了您所期望的节点名称和文本。 我认为关键是使用 APEX 方法 hasText() 和 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>blahblahblah@blahblahblah.com</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();
}

这是另一个基于 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>blahblahblah@blahblahblah.com</email>' +
'<phone>4155555555</phone>' +'</item>' +'</document>';
System.debug(parse(XML_STR));

关于java - 基本的 XML 解析问题。无法通过 Java XmlStreamReader 方法找到节点名称。有任何想法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13675702/

相关文章:

java - 有没有办法在搜索字谜时保留单词的大小写?

java - 为什么在运行时找不到公共(public)类?

java - google-play-services 不会构建到 Eclipse 中的 Android Maps HelloWorld 项目中

java - 如何更改android studio中的编码

android - 如何通过 Web API 管理 Android 与外部设备的通信?

java - 嵌套 if 语句 - 变量可能尚未初始化

java - 使用架构问题的 XSD 验证

java - JSON 到 XML 的转换而不改变序列

PHP 生成的 XML 显示无效的 Char 值 27 消息

xml - 通过将元素列入白名单来清理 SVG 文档