1

いくつかの基本的なXMLを解析することに運がありません。私はこれをApex言語で行っていますが、構文的にはJavaとほぼ同じであり、この場合、XML解析エンジンとしてjava.xml.stream.XMLStreamReaderを使用します。

問題は次のとおりです。実際のXMLノード名を取得することができません。XmlStreamReaderクラス内のgetLocalName()メソッドは、ループするときにすべてのノードに対して常にnullを返します。

コードはこちら

この時点で非常に基本的な機能。これを実行すると、reader.getLocalName()が常にnullを返すことがわかります。したがって、付随するすべてのメソッド(getNameSpace()、getLocation()、getPrefix())もnullを返します。

なぜ何かアイデアはありますか?XMLがその形式で到着するのに行き詰まっているので、そのまま解析する必要があります。さまざまな回避策(正規表現、ノードのカウントなど)を使用できますが、それらは厄介で理想的ではありません。

4

1 に答える 1

0

あなたのコードを、ワークベンチの匿名実行ウィンドウでテストできる 1 つのブロックに作り直しました。コードを実行し、実行ログをフィルタリングして 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));
于 2012-12-03T15:36:17.380 に答える