- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我们必须解析来自生成器的 xml 信息,该生成器为一堆气象站创建虚假天气数据。目前我们只是打印它,但稍后我们必须用它做一些事情。然而,我们收到的数据由多个 XML"file"组成。有没有办法分离数据并将其拆分为新的 <?xml...?>
? (数据是随机 split 的连续流)我们的代码:
public class Main {
static private final int portNumber = Null;
public static void main(String[] args) {
try {
ServerSocket serverSocket = new ServerSocket(portNumber);
Socket clientSocket = serverSocket.accept();
BufferedReader clientReader = new BufferedReader(
new InputStreamReader(clientSocket.getInputStream()));
XMLInputFactory factory = XMLInputFactory.newInstance();
XMLStreamReader reader = factory.createXMLStreamReader(clientReader);
while (reader.hasNext()) {
int event = reader.next();
if (event == XMLStreamConstants.START_ELEMENT) {
try {
String text = reader.getElementText();
System.out.println("Element Local Name:" + reader.getLocalName());
System.out.println("Text:" + text);
} catch (XMLStreamException e) {
System.out.println(e);
}
}
else if(event == XMLStreamConstants.END_ELEMENT){
reader.close();
}
}
} catch (IOException e) {
System.out.println("Error: Unable to Start Server Socket\n\t" + e);
} catch (XMLStreamException e){
System.out.println(e);
}
}
}
xml 示例(我们依次收到多个):
<?xml version="1.0"?>
<!-- The WEATHERDATA-element contains multiple MEASUREMENT-elements -->
<WEATHERDATA>
<MEASUREMENT>
<STN>123456</STN>
<DATE>2009-09-13</DATE>
<TIME>15:59:46</TIME>
<TEMP>-60.1</TEMP>
<DEWP>-58.1</DEWP>
<STP>1034.5</STP>
<SLP>1007.6</SLP>
<VISIB>123.7</VISIB>
<WDSP>10.8</WDSP>
<PRCP>11.28</PRCP>
<SNDP>11.1</SNDP>
<FRSHTT>010101</FRSHTT>
<CLDC>87.4</CLDC>
<WNDDIR>342</WNDDIR>
</MEASUREMENT>
</WEATHERDATA>
我们还有一个 dtd 文件,但我不确定这是否有帮助。
最佳答案
使用java.util.Scanner
可以作为一种快速解决方法。 disassemble()
函数会跳过 XML 声明(如果存在),并组合直到并包括下一个结束字符 </WEATHERDATA>
的所有字符。标记为“字符串”。然后将结果传递给回调,在本示例中,该回调使用 JAXB 将 XML 转换为 POJO。
我不喜欢Scanner
的什么是它在内部缓冲输入流,因此当流关闭时可能会丢失最后一条消息。
public class DisassembleXml {
private static final int port = 8888;
private static final Pattern XML_DECL_PATTERN = Pattern.compile("<\\?xml.*?\\?>");
private static final Pattern DATA_PATTERN =
Pattern.compile(".*?</WEATHERDATA>\\s+", Pattern.DOTALL);
public static void main(String[] args) throws Exception {
final ServerSocket serverSocket = new ServerSocket(port);
System.out.printf("Listening on %d%n", serverSocket.getLocalPort());
final Socket clientSocket = serverSocket.accept();
System.out.printf("Processing from %s%n", clientSocket);
try (Reader sr = new InputStreamReader(clientSocket.getInputStream(), StandardCharsets.ISO_8859_1))
{
disassemble(sr, new ConvertToPojoAndPrint());
}
catch (Exception e)
{
e.printStackTrace();
}
}
private static void disassemble(Reader reader, Consumer<String> xmlConsumer) {
final Scanner sc = new Scanner(reader).useDelimiter("\\Z");
try {
while (true) {
final String xml = sc
.skip(XML_DECL_PATTERN)
.findWithinHorizon(DATA_PATTERN, 0);
if (xml == null || xml.isEmpty())
break;
xmlConsumer.accept(xml);
}
}
catch (Exception e) {
throw new IllegalStateException("cannot interpret stream", e);
}
}
private static class ConvertToPojoAndPrint implements Consumer<String>
{
final JAXBContext jaxbContext;
final Unmarshaller unmarshaller;
ConvertToPojoAndPrint() throws JAXBException {
jaxbContext = JAXBContext.newInstance(WeatherData.class);
unmarshaller = jaxbContext.createUnmarshaller();
}
@Override
public void accept(String xml) {
try {
final WeatherData weatherData = (WeatherData) unmarshaller.unmarshal(new StringReader(xml));
System.out.println("Another sample: " + weatherData);
}
catch (Exception e) {
throw new IllegalStateException(e);
}
}
}
@XmlRootElement(name = "WEATHERDATA")
private static class WeatherData
{
@XmlElement(name = "MEASUREMENT")
Measurement measurement;
@Override
public String toString() { return "WeatherData{" + "measurement=" + measurement + '}'; }
}
private static class Measurement
{
@XmlElement(name = "STN")
String stn;
// ... skipping the rest of elements for brevity
@Override
public String toString() { return "Measurement{" + "stn='" + stn + '\'' + '}'; }
}
}
关于java - 如何使用 XMLStreamReader 在 Java 中解析多个 XML 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48385694/
像这样遍历 XML 文档时 while(streamReader.hasNext()){ streamReader.next(); if(streamReader.getEventTy
我正在使用 XMLStreamReader 读取 XML 文件并查找特定元素,然后更新相应的值。 我的问题是有没有办法可以打印每个元素,包括文档的开头,例如: 每次我执行reader.next()?
我正在使用 XMLStreamReader 并解析以下 XML: level0 level1
正如我在 Reading escape characters with XMLStreamReader 中看到的那样,这个问题似乎以前曾出现过。 但我在这里看到的问题略有不同。 我正在读取一个相当大的
我正在使用 XMLStreamReader 解析 XML 。在 标签有一些从数据库加载的数据(WebRowSet对象)。问题是这个标签的内容非常长(假设有几百KB——数据以Base64编码),但是in
我希望 XmlStreamReader 从文档的开头启动(显然),然后当我对其调用 next() 时跳转到 XML 文档的根目录。然而,可怕的是,我看到它跳转到第一个带有文本的标签,并且总是忽略根,并
我正在使用 javax.xml 中的 XMLStreamReader 接口(interface)来解析 XML 文件。该文件包含巨大的数据量和几个 KB 的单个文本节点。 验证和读取通常效果很好,但我
我有一个 XMLStreamReader,当我仔细阅读 xml 时,它会跳过一个元素并转到下一个元素。我想按顺序阅读所有内容,因此这对我来说非常烦人并且破坏了我的解析。 这是 XML: Cha
更新 Java 社区中没有现成的 XML 解析器可以进行 NIO 和 XML 解析。这是我找到的最接近的,但不完整:http://wiki.fasterxml.com/AaltoHome 我有以下代码
你好我想知道如何将XML标签形式的字符串内容转换成XMLStreamReader 最佳答案 您可以使用 XMLInputFactory.createXMLStreamReader , 传入 Strin
我的 XML 中有一些来自 Unicode 扩展 B 中文/日文/韩文的字符: 𠀀𠀁𠀂𠀃𠀄𪛔𪛕𪛖 但是当我使用 streamReader.getText() 时它返回: ࠀ 有谁知道J
我有以下 XML 代码 medium weak 我使用以下代
我有一些正在阅读的 xml。 website Tommy Jay
如果我有一个 XML 元素,例如: this is a title 使用 XMLStreamReader.getElementText() 很容易获取文本。但是,如果我遇到这样的元素,我无法弄清楚如何
假设我们有以下 XML "Hi" 我使用 XMLStreamReader 加载此 XML 并使用读取器对象进行解析。当我使用阅读器的 getText() 打印解析时遇到的字
我正在使用下面的代码使用 XMLStreamReader 读取 hadoop RecordReader 中的大型 xml 文件(以 GB 为单位) public class RecordReader
我在XMLStreamReader中找不到任何peek或unread功能文档。例如,为了解析 HTML 列表中的子元素列表,获得至少一个标记前瞻的首选方法是什么? 当我使用 ul 和
我需要连接一个接收 StAX XMLStreamReader 作为输入的 API,并过滤提供的流(将某个属性的值从 true 更改为 false)。 查看了 StreamReaderDelegate,
我同时运行了 Python 脚本和 Java 测试。它们都试图做完全相同的事情——打开一个套接字,接收一个永无止境的 XML 流,并在接收到 XML 时对其进行解析。 Python 脚本使用 Expa
我正在使用 XMLStreamReader 读取 xml 文件。 该文件包含以下形式的转义字符:ü。 在我看来,两个转义字符应该代表字符“ü”(UTF-8 编码?) 但 xml 流读取器创建以下字符
我是一名优秀的程序员,十分优秀!