- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在XMLStreamReader中找不到任何peek
或unread
功能文档。例如,为了解析 HTML 列表中的子元素列表,获得至少一个标记前瞻的首选方法是什么?
<ul>
<li>
<li>
</ul>
当我使用 ul
和 li
的解析函数创建递归体面解析器时,li
解析函数必须在找到结束时终止ul
的标签,但不能消耗它,因为 ul
解析函数需要它才能成功。
我习惯用peek
或unread
来解决此类问题,但它们似乎丢失了。解决这个问题的首选 Java 方法是什么?
更新:我使用 XMLStreamReader 实现了没有前瞻的解析器。
最佳答案
有一种常见的实现递归解析器的方法可以避免 unread
的需要。或peek
,通过预读取下一个标记、存储它并对其进行测试:
<li>
和 </ul>
)对其进行测试实际上,您已经看到了前方。
Dragon 编译器书的第一版在其早期概述章节中以 C 语言提供了一个很好的示例(他们在第二版中使用了 Java,但没有必要夸大其词,恕我直言 - C 风格在 Java 中运行良好) .我将尝试从我自己的源代码中提取一个示例,但我的代码被分成一个库层,其中包含处理更易于使用的方法。我将尝试将它们结合起来以形成一个清晰的示例,但它可能不会独立运行。将其视为伪代码,以说明该想法,并且您需要填补空白。
XMLStreamReader in;
int token;
String localname;
public void parse() {
next();
if (token==START_ELEMENT && localname.equals("ul")) ul();
}
void ul() {
next(); // assume we are called when a <ul> is seen, so we consume it
while (true) { // loops for list
if (token==START_ELEMENT && localname.equals("li")) li(); // ifs for choice
else if (token==START_ELEMENT && localname.equals("sometag")) sometag();
else break;
}
if (token==END_ELEMENT && localname.equals("ul")) next();
else throw new RuntimeException("expected </ul>");
// <li> or <sometag> would also be acceptable
}
void li() {
next();
...
}
void next() {
token = in.next(); // consume the token means to set up the next one
localname = in.getLocalName();
}
我发现如果您创建一个图层库来处理重复的东西,那么使用起来会更容易,例如我有:
boolean startTag(String name)
如果匹配则返回 truevoid requireStartTag(String name)
如果匹配则消耗,否则抛出异常但我认为这个例子更清楚,保留所有字面意义。
还有其他问题,例如跳过非元素标记(例如评论、PI 等);跟踪您所在的线路以获取更多有用的异常(exception)情况等。
关于java - 如何获得 XMLStreamReader 的前瞻性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12561181/
像这样遍历 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 流读取器创建以下字符
我是一名优秀的程序员,十分优秀!