gpt4 book ai didi

java - 通过 DOM 解析器从 XML 处理 CDATA

转载 作者:数据小太阳 更新时间:2023-10-29 02:24:32 24 4
gpt4 key购买 nike

我以前从未处理过 XML,所以我不确定如何处理 XML 文件中的 CDATA。我迷失在节点、父节点、子节点、nList 等中。

谁能根据这些代码片段告诉我我的问题是什么?

我的 getTagValue() 方法适用于所有标签,但“Details”除外,它包含 CDATA。

.....
NodeList nList = doc.getElementsByTagName("Assignment");
for (int temp = 0; temp < nList.getLength(); temp++) {
Node nNode = nList.item(temp);
if (nNode.getNodeType() == Node.ELEMENT_NODE) {
Element eElement = (Element) nNode;
results = ("Class : " + getTagValue("ClassName", eElement)) +
("Period : " + getTagValue("Period", eElement)) +
("Assignment : " + getTagValue("Details", eElement));
myAssignments.add(results);
}
}
.....
private String getTagValue(String sTag, Element eElement) {
NodeList nlList = eElement.getElementsByTagName(sTag).item(0).getChildNodes();

Node nValue = (Node) nlList.item(0);
if((CharacterData)nValue instanceof CharacterData)
{
return ((CharacterData) nValue).getData();
}
return nValue.getNodeValue();
}

最佳答案

我怀疑您的问题出在 getTagValue 方法的以下代码行中:

Node nValue = (Node) nlList.item(0);

你总是第一个 child !但你可能有不止一个。

以下示例有 3 个子节点:文本节点“detail”、CDATA 节点“with cdata”和文本节点“here”:

<Details>detail <![CDATA[with cdata]]> here</Details>

如果你运行你的代码,你只会得到“细节”,你会失去其余部分。

下面的例子有 1 个子节点:一个 CDATA 节点“detail with cdata here”:

<Details><![CDATA[detail with cdata here]]></Details>

如果你运行你的代码,你会得到一切。

但是和上面一样的例子是这样写的:

<Details>
<![CDATA[detail with cdata here]]>
</Details>

现在有 3 个 child ,因为空格和换行被拾取为文本节点。如果您运行您的代码,您将获得第一个带有换行符的空文本节点,您将丢失其余部分。

您要么必须遍历所有子项(无论有多少)并连接每个子项的值以获得完整结果,要么如果区分纯文本和 CDATA 内的文本对您来说并不重要,则设置 coalescing首先是文档生成器工厂的属性:

DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
docFactory.setCoalescing(true);
...

Coalescing specifies that the parser produced by this code will convert CDATA nodes to Text nodes and append it to the adjacent (if any) text node. By default the value of this is set to false.

关于java - 通过 DOM 解析器从 XML 处理 CDATA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10038747/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com