【问题标题】:How to parse this XML file and what parser to use?如何解析这个 XML 文件以及使用什么解析器?
【发布时间】:2014-01-17 16:59:04
【问题描述】:

我对 XMLParsing 非常陌生。 它今天在工作,没有设法解析文件并将其放入 arrayList。

我的文件有点像这样

<type>
 <OBJECT_TYPE>horse</OBJECT_TYPE>
   <prop>blabla</prop>
   <param>black</param>
  <OBJECT_TYPE>cat</OBJECT_TYPE>
   <prop>blabla</prop>
   <param>black</param>
  <OBJECT_TYPE>car</OBJECT_TYPE>
   <prop>blabla</prop>
   <param>black</param>
</type>

但要长得多,而不是那个内容。 我尝试使用 SaxParser 但没有成功。 而且我已经阅读了几乎所有 SaxParser turials,但所有解析 xml 都有属性,而我的 XML 没有任何属性。

那么对于这种 XML,我应该使用什么解析器才能将其保存到 ArrayList 中? 我只想列出我的 OBJECT_TYPES 没有别的。没有道具也没有参数。

【问题讨论】:

标签: java xml-parsing saxparser


【解决方案1】:

就是这样

import java.util.ArrayList;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class ReadXMLFile {

   public static void main(String argv[]) {
       final ArrayList<String> al=new ArrayList<String>();

    try {

    SAXParserFactory factory = SAXParserFactory.newInstance();
    SAXParser saxParser = factory.newSAXParser();

    DefaultHandler handler = new DefaultHandler() {

    boolean bfname = false;
    boolean blname = false;
    boolean bnname = false;
    boolean bsalary = false;

    public void startElement(String uri, String localName,String qName, 
                Attributes attributes) throws SAXException {

        System.out.println("Start Element :" + qName);

        if (qName.equalsIgnoreCase("OBJECT_TYPE")) {
            bfname = true;
        }



    }

    public void endElement(String uri, String localName,
        String qName) throws SAXException {

        System.out.println("End Element :" + qName);

    }

    public void characters(char ch[], int start, int length) throws SAXException {

        if (bfname) {

            al.add(new String(ch, start, length));
            bfname = false;
        }



    }

     };

       saxParser.parse("C:\\Users\\Naren\\workspace\\Regex\\src\\test.xml", handler);
       System.out.println(al);

     } catch (Exception e) {
       e.printStackTrace();
     }

   }

}

输出

[马、猫、车]

【讨论】:

  • 你确定一个有效吗?因为我很确定我确实喜欢这样,它只写了这样的内容:example.com@49030, example.com@930490
  • 检查一下,我现在只编写和测试过......而且我也发布了输出......它会工作......
  • @Sembrano:这里的字符方法不好(阅读伊恩的回答)。因此,如果这就是您所拥有的,那么您正在阅读错误的教程。请参阅 Oracle 的:docs.oracle.com/javase/tutorial/jaxp/sax/parsing.html
  • 所以这个 XPath 来自 Jelementtree?
  • 是的,Naren 它至少适用于这个解决方案,但是当我根据你拥有的对象类型从参数和道具中获取所有数据时,问题就会出现。然后另一个问题是,如果用户编辑 xml 并想保存它,我猜 SAX 解析根本不起作用。
【解决方案2】:

SAX 解析这种格式的标准模式是

  • startElement
    • 如果标签名称为OBJECT_TYPE,则创建一个新缓冲区(例如 StringBuilder)来收集字符数据。
  • characters
    • 如果存在活动缓冲区,则将当前字符块附加到该缓冲区
  • endElement
    • 如果标签名称是OBJECT_TYPE,则将缓冲区转换为字符串,然后对它做任何你需要做的事情。

解析器会将元素的文本内容传递给处理程序的characters 方法,但不能保证在一个块中为您提供整个连续文本块,这就是您需要将其累积在一个缓冲区并在endElement 处进行处理。

【讨论】:

    【解决方案3】:

    我就是这样解决的:

    public void ParserForObjectTypes() throws SAXException, IOException,
                ParserConfigurationException {
    
            try {
                FileInputStream file = new FileInputStream(new File(
                        "xmlFiles/CoreDatamodel.xml"));
    
                DocumentBuilderFactory builderFactory = DocumentBuilderFactory
                        .newInstance();
    
                DocumentBuilder builder = builderFactory.newDocumentBuilder();
    
                Document xmlDocument = builder.parse(file);
    
                XPath xPath = XPathFactory.newInstance().newXPath();
    
                String expression = "//OBJECT_TYPE";
                NodeList nodeList = (NodeList) xPath.compile(expression).evaluate(
                        xmlDocument, XPathConstants.NODESET);
                for (int i = 0; i < nodeList.getLength(); i++) {
    
    
                    model.addElement(nodeList.item(i).getFirstChild()
                            .getNodeValue());
    
                }
    
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (SAXException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (ParserConfigurationException e) {
                e.printStackTrace();
            } catch (XPathExpressionException e) {
                e.printStackTrace();
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2012-02-27
      • 1970-01-01
      • 1970-01-01
      • 2012-06-08
      • 2012-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-24
      相关资源
      最近更新 更多