如何从Java文件中以字符串形式读取XML内容

时间:2019-06-18 15:56:44

标签: java xml xml-parsing

我从源代码中获取了一个文本文件,该文件中的以下内容为一行。

var url = "//server/application/Database/Edit?id=" + theid;

在我的代码中,我必须将每个员工数据读取为String。例如:<employees><employee><id>101</id><name>Lokesh Gupta</name><title>Author</title></employee><employee><id>102</id><name>Brian Lara</name><title>Cricketer</title></employee></employees>作为字符串,<employee><id>101</id><name>Lokesh Gupta</name><title>Author</title></employee>作为另一个字符串。当我在控制台上打印内容时,它必须打印<employee><id>102</id><name>Brian Lara</name><title>Cricketer</title></employee>。你能让我知道怎么做吗?

通常,我从源代码中获取的文件包含一行中的100+百万个员工详细信息,我必须将所有这些员工详细信息读取为单独的String并将其存储在其他文件中。由于文件很大,因此我尝试使用SAX解析器,并且能够解析xml内容,但无法将整个数据读取为字符串。

我尝试使用SAX解析器和默认处理程序读取此内容。但是在startElement和EndElement方法中,我必须编写逻辑以分别附加<employee><id>101</id><name>Lokesh Gupta</name><title>Author</title></employee><><。我想知道一种更好的阅读方法,而不是编写逻辑来添加尖括号。

1 个答案:

答案 0 :(得分:0)

一种方法是使用JaxB的流功能,该功能有效地使用了其下的SAX。这是一个示例:

 // create JAXBContext for the primer.xsd
        JAXBContext context = JAXBContext.newInstance("primer");

        Unmarshaller unmarshaller = context.createUnmarshaller();

        // purchase order notification callback
        final PurchaseOrders.Listener orderListener = new PurchaseOrders.Listener() {
            public void handlePurchaseOrder(PurchaseOrders purchaseOrders, PurchaseOrderType purchaseOrder) {
                System.out.println("this order will be shipped to "
                        + purchaseOrder.getShipTo().getName());
            }
        };

        // install the callback on all PurchaseOrders instances
        unmarshaller.setListener(new Unmarshaller.Listener() {
            public void beforeUnmarshal(Object target, Object parent) {
                if(target instanceof PurchaseOrders) {
                    ((PurchaseOrders)target).setPurchaseOrderListener(orderListener);
                }
            }

            public void afterUnmarshal(Object target, Object parent) {
                if(target instanceof PurchaseOrders) {
                    ((PurchaseOrders)target).setPurchaseOrderListener(null);
                }
            }
        });

        // create a new XML parser
        SAXParserFactory factory = SAXParserFactory.newInstance();
        factory.setNamespaceAware(true);
        XMLReader reader = factory.newSAXParser().getXMLReader();
        reader.setContentHandler(unmarshaller.getUnmarshallerHandler());

        for (String arg : args) {
            // parse all the documents specified via the command line.
            // note that XMLReader expects an URL, not a file name.
            // so we need conversion.
            reader.parse(new File(arg).toURI().toString());
        }
    }
}

它直接取自jaxb / ri中的jaxB样本 https://github.com/javaee/jaxb-v2/blob/master/jaxb-ri/samples/src/main/samples/streaming-unmarshalling/src/Main.java

PurchaseOrders.Listener接口是:

public static interface Listener {
        void handlePurchaseOrder(PurchaseOrders purchaseOrders, PurchaseOrderType purchaseOrder);
    }