标签: stax

是否有Java XML API可以在不解析字符实体的情况下解析文档?

我有程序需要解析包含字符实体的XML.程序本身不需要解决它们,它们的列表很大并且会发生变化,所以如果可以的话,我想避免明确支持这些实体.

这是一个简单的例子:

<?xml version="1.0" encoding="UTF-8"?>
<xml>Hello there &something;</xml>
Run Code Online (Sandbox Code Playgroud)

是否存在可以在不解析(非标准)字符实体的情况下成功解析文档的Java XML API?理想情况下,它会将它们转换为可以特殊处理的特殊事件或对象,但我会选择一种可以默默抑制它们的选项.

答案和示例:

Skaffman给了我答案:使用IS_REPLACING_ENTITY_REFERENCES设置为false 的StAX解析器.

这是我试图尝试的代码:

XMLInputFactory inputFactory = XMLInputFactory.newInstance();
inputFactory.setProperty(XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES, false);
XMLEventReader reader = inputFactory.createXMLEventReader(
    new FileInputStream("your file here"));

while (reader.hasNext()) {
    XMLEvent event = reader.nextEvent();
    if (event.isEntityReference()) {
        EntityReference ref = (EntityReference) event;
        System.out.println("Entity Reference: " + ref.getName());
    }
}
Run Code Online (Sandbox Code Playgroud)

对于上面的XML,它将打印" Entity Reference: something".

java xml parsing stax character-entities

4
推荐指数
1
解决办法
1万
查看次数

使用StAX格式化XML文件

我正在使用StAX XML流编写器来编写XML文件.它将所有数据写入一行.我希望所有标签都缩进而不是单行.

java xml stax

4
推荐指数
1
解决办法
1万
查看次数

java使用StAX以通用方式获取子元素

我正在尝试使用StAX(我已经不喜欢它了......)
似乎使用它的唯一方法是通过连续的if-else条件.
但最重要的是,似乎没有办法将元素与其子元素相关联,除非事先知道正在解析的xml文档的结构.这是正确的吗?
我尝试了以下内容:我在String中使用了这个xml

<ns1:Root xmlns:ns1=\"http://rootNameSpace.com/\">
<ns1:A/>
<ns1:B>
        <Book xmlns=\"http://www.myNameSpace.com\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">
            <Data>
                <Author>John</Author>
                <Edition>1</Edition>
                <PubHouse>Small Publishing House</PubHouse>
                <Price>37.8</Price>
            </Data>
        </Book>
</ns1:B>
</ns1:Root>
Run Code Online (Sandbox Code Playgroud)

我想使用StAX来获取Book元素,但似乎我只能编写硬编码所有结构的代码.
即使用XMLEventReader,一旦你得到Book,就开始循环数据,作者等.
这是否有通用的解决方案?
我尝试了以下内容来解决这个问题:我试图从String转到XMLEventReader并返回String但我无法获得我最初使用的确切String表示(命名空间在括号中,额外的冒号等).

StringBuilder xml = new StringBuilder();
XMLInputFactory inputFactory = XMLInputFactory.newInstance();
String msg = "<ns1:Root xmlns:ns1=\"http://rootNameSpace.com/\"><ns1:A/><ns1:B><Book xmlns=\"http://www.myNameSpace.com\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><Data><Author>John</Author><Edition>1</Edition><PubHouse>Small Publishing House</PubHouse><Price>37.8</Price></Data></Book></ns1:B></ns1:Root>";
InputStream input = new ByteArrayInputStream(msg.getBytes("UTF-8"));
XMLEventReader xmlEventReader = inputFactory.createXMLEventReader(input);
while (xmlEventReader.hasNext())
{

    XMLEvent event = xmlEventReader.nextEvent();
    StringWriter sw = new StringWriter();
    event.writeAsEncodedUnicode(sw);
   xml.append(sw);

}
System.out.println(xml);
Run Code Online (Sandbox Code Playgroud)

我得到以下内容:

<?xml version="1.0" encoding='UTF-8' standalone='no'?><['http://rootNameSpace.com/']:ns1:Root xmlns:ns1='http://rootNameSpace.com/'><['http://rootNameSpace.com/']:ns1:A></ns1:A><['http://rootNameSpace.com/']:ns1:B><['http://www.myNameSpace.com']::Book xmlns:='http://www.myNameSpace.com' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'><['http://www.myNameSpace.com']::Data><['http://www.myNameSpace.com']::Author>John</Author><['http://www.myNameSpace.com']::Edition>1</Edition><['http://www.myNameSpace.com']::PubHouse>Small …
Run Code Online (Sandbox Code Playgroud)

java stax dom jaxp

4
推荐指数
1
解决办法
1万
查看次数

Stax未检测到End元素

我正在读一个XML文件,如下所示:

<ts>
    <tr comment="" label="tr1">
        <node order="1" label="" />
    </tr>
</ts>
Run Code Online (Sandbox Code Playgroud)

我希望下面的代码e在屏幕上打印出三个:

XMLInputFactory factory = XMLInputFactory.newInstance();
XMLStreamReader sr = factory.createXMLStreamReader(new FileReader("test.xml"));

while (sr.hasNext()) {
    int eventType = sr.next();

    if (eventType == XMLStreamReader.START_DOCUMENT) {
        continue;
    } else if (eventType == XMLStreamReader.END_ELEMENT) {
        System.out.println("e");
    } else if (eventType == XMLStreamReader.START_ELEMENT) {
        System.out.println("s");
    }
}
Run Code Online (Sandbox Code Playgroud)

但它不起作用!关于如何解决这个问题的任何想法?

注意:我认为它与自闭合标签有关,例如: <myTag id="1" />

java xml stax

4
推荐指数
2
解决办法
3531
查看次数

java.net.MalformedURLException - 在 StAX 解析 XML 文件时

我必须用 StAX 解析 XML 文件。

我发现了一堆异常:

javax.xml.stream.XMLStreamException: java.net.MalformedURLException
    at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.setInputSource(XMLStreamReaderImpl.java:217)
    at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.<init>(XMLStreamReaderImpl.java:189)
    at com.sun.xml.internal.stream.XMLInputFactoryImpl.getXMLStreamReaderImpl(XMLInputFactoryImpl.java:262)
    at com.sun.xml.internal.stream.XMLInputFactoryImpl.createXMLStreamReader(XMLInputFactoryImpl.java:129)
    at com.epam.lab.StaxXmlParser.<init>(StAXParserDemo.java:46)
    at com.epam.lab.StAXParserDemo.main(StAXParserDemo.java:20)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
Caused by: java.net.MalformedURLException
    at java.net.URL.<init>(URL.java:619)
    at java.net.URL.<init>(URL.java:482)
    at java.net.URL.<init>(URL.java:431)
    at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(XMLEntityManager.java:610)
    at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.startEntity(XMLEntityManager.java:1290)
    at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.startDocumentEntity(XMLEntityManager.java:1242)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.setInputSource(XMLDocumentScannerImpl.java:257)
    at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.setInputSource(XMLStreamReaderImpl.java:204)
Run Code Online (Sandbox Code Playgroud)

这是 xml 文件的外观:

<?xml version="1.0" encoding="UTF-8"?>
<staff xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:noNamespaceSchemaLocation="newEmployee.xsd">    
    <employee>
        <name>Carl Cracker</name>
        <salary>75000</salary>
        <hiredate year="1987" month="12" day="15" />
    </employee>
    <employee>
        <name>Harry Hacker</name>
        <salary>50000</salary>
        <hiredate year="1989" month="10" day="1" />
    </employee>
    <employee> …
Run Code Online (Sandbox Code Playgroud)

java xml stax xml-parsing runtimeexception

4
推荐指数
1
解决办法
6035
查看次数

在StAX XMLStreamConstants.CHARACTERS事件中获取XML节点文本时出现问题

在使用StAX和XMLStreamReader读取XML文件时,我遇到了一个奇怪的问题.不确定它是错误还是我做错了什么.还在学习StAX.

所以问题是,

  1. XMLStreamConstants.CHARACTERS事件中,当我收集节点文本作为XMLStreamReader.getText()方法.
  2. 如果在节点文本中存在&,<,>甚至隐藏的内容,则仅返回文本字符串的第一部分.例如ABC & XYZ只返回ABC

简化的Java源码:

    // Start StaX reader
    XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance();
    try {
        XMLStreamReader xmlStreamReader = xmlInputFactory.createXMLStreamReader(inStream);
        int event = xmlStreamReader.getEventType();
        while (true) {
            switch (event) {
                case XMLStreamConstants.START_ELEMENT:
                    switch (xmlStreamReader.getLocalName()) {
                        case "group":
                        // Do something
                            break;
                        case "source":
                            isSource = true;
                            break;
                        case "target":
                            isTarget = true;
                            break;
                        default:
                            isSource = false;
                            isTrans = false;
                            break;
                    }
                    break;
                case XMLStreamConstants.CHARACTERS:
                    if (srcData != null) {
                        String srcTrns …
Run Code Online (Sandbox Code Playgroud)

java xml stax

4
推荐指数
1
解决办法
2116
查看次数

将stax XML写入String

我正在使用stax来创建我的Web应用程序所需的XML文档.目前我在这样的文件中创建我的XML:

    XMLOutputFactory factory = XMLOutputFactory.newInstance();
    String output=null;
     try 
     {
             XMLStreamWriter writer = factory.createXMLStreamWriter(
                     new FileWriter("C:\\Junk\\xmlDoc.xml"));
             writer.writeStartDocument();
             writer.writeStartElement("TagName1");
             writer.writeAttribute("AAA", "BBB");
             writer.writeEndElement();
             writer.writeEndDocument();             
             writer.flush();
             writer.close();
     } 
     catch (XMLStreamException e) 
     {
         e.printStackTrace();
     } 
     catch (IOException e) 
     {      
        e.printStackTrace();
     } 
Run Code Online (Sandbox Code Playgroud)

但是xml文件不是我想要的,我需要在一个中创建我的XML String.不幸的是我无法弄清楚OutputStream我需要哪个对象而不是FileWriter

java xml stax java-io

4
推荐指数
1
解决办法
3465
查看次数

如何使用 Stax 从 xml 文件中提取属性值?

我必须用 stax 解析 xml 文件,除了一点之外,我基本上做了我需要的事情。

我的代码逻辑没有提取正确的属性。我的输出如下:

Employee { name=Carl Cracker, salary=75000.0, hireDay=null }
Employee { name=Harry Hacker, salary=50000.0, hireDay=null }
Employee { name=Tony Tester, salary=40000.0, hireDay=null }
Run Code Online (Sandbox Code Playgroud)

这是xml文件的内容:

<?xml version="1.0" encoding="UTF-8"?>
<staff xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:noNamespaceSchemaLocation="newEmployee.xsd">
    <employee>
        <name>Carl Cracker</name>
        <salary>75000</salary>
        <hiredate year="1987" month="12" day="15" />
    </employee>
    <employee>
        <name>Harry Hacker</name>
        <salary>50000</salary>
        <hiredate year="1989" month="10" day="1" />
    </employee>
    <employee>
        <name>Tony Tester</name>
        <salary>40000</salary>
        <hiredate year="1990" month="3" day="15" />
    </employee>
</staff>
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

class StaxXmlParser {    
    private List<Employee> employeeList;
    private Employee currentEmployee;
    private String tagContent;
    private XMLStreamReader …
Run Code Online (Sandbox Code Playgroud)

java xml stax xml-parsing

3
推荐指数
1
解决办法
3058
查看次数

StAX 不返回字符串中的所有字符

我一直在尝试使用 StAX 创建 XML 控制器类。我的问题是我没有得到元素的完整字符串,而是得到了字符串的一小部分。(请注意,出于安全原因,某些内容已被隐藏,这些内容将显示为{content}

Characters characters = event.asCharacters();
if (!characters.isWhiteSpace()) {
    System.out.println(characters.getData());
}
Run Code Online (Sandbox Code Playgroud)

上面的代码不返回完整的字符串。

我期望收到的是:
{responseType} \([0-9]+\) ACC: [0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+

我得到的是上面的字符串,分为 5 个单独的部分:
{responseType} \([0-9]+\) ACC: [0-9]
+,[0-9]+,[0-9]
+,[0-9]+,[0-9]
+,[0-9]+,[0-9]
+,[0-9]+

我的代码:

public static ArrayList<SmsCommand> readXML() {
    if (init()) {
        try {
            while (eventReader.hasNext()) {
                XMLEvent event = eventReader.nextEvent();
                switch (event.getEventType()) {
                case XMLStreamConstants.START_ELEMENT:
                    StartElement startElement = event.asStartElement();
                    String qName = startElement.getName().getLocalPart();
                    if (qName.equalsIgnoreCase("command")) {
                        Iterator<Attribute> attributes = startElement.getAttributes();
                        command = new SmsCommand(attributes.next().getValue());
                    }
                    break;
                case XMLStreamConstants.CHARACTERS:
                    Characters …
Run Code Online (Sandbox Code Playgroud)

java xml stax

3
推荐指数
1
解决办法
1706
查看次数

如何提高 Java 中 StAX xml 解析器的速度?

我有一个 XML 解析器StAX,我正在使用它来解析一个巨大的文件。但是,我想尽可能缩短时间。我正在读取将其放入数组中的值并将其发送到另一个函数进行评估。我正在调用该displayName标签,它应该在获取名称后立即转到下一个 xml,而不是读取整个 xml 文件。我正在寻找最快的方法。

爪哇:


import java.io.File;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.Iterator;
import javax.xml.namespace.QName;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.events.*;

public class Driver {

    private static boolean bname;

    public static void main(String[] args) throws FileNotFoundException, XMLStreamException {

        File file = new File("C:\\Users\\Robert\\Desktop\\root\\SDKCode\\src\\main\\java\\com\\example\\xmlClass\\data.xml");


        parser(file);
    }

    public static void parser(File file) throws FileNotFoundException, XMLStreamException {

        bname = false;


        XMLInputFactory factory = XMLInputFactory.newInstance();


        XMLEventReader eventReader = factory.createXMLEventReader(new FileReader(file));


        while (eventReader.hasNext()) {

            XMLEvent event = …
Run Code Online (Sandbox Code Playgroud)

java xml stax

3
推荐指数
1
解决办法
6419
查看次数