Parent/Child 与 Sax 解析器解析 xml 的关系
Parent/Child relationship in parsing xml with Sax Parser
我已经看到了这个问题,但没有得到回答,我希望这次我能走运。正如问题所述,我正在尝试使用 SAX 解析器解析 xml 并需要维护 parent/child 关系。由于 SAX 解析器是上下文无关的,所以我需要创建一些我自己的上下文。我已经完成了一半,但仍停留在这一点上。下面是我的 xml,
的示例结构
<Folder name="Folder1" nodeId="1">
<Level1 name="NodeA1" nodeId="2">
<Level2 name="NodeA11" ImageId="Image11.png" nodeId="2" />
<Level2 name="NodeA12" ImageId="Image12.png" nodeId="2" />
</Level1>
<Level1 name="NodeA2" nodeId="3">
<Level2 name="SubNodeA2" nodeId="131">
<Level3 name="NodeA21" ImageId="Image21.png" nodeId="131" />
</Level2>
<Level2 name="NodeA13" ImageId="Image13.png" nodeId="3" />
<Level2 name="NodeA14" ImageId="Image14.png" nodeId="3" />
</Level1>
</Folder>
<Folder name="Folder2" nodeId="2">
<Level1 name="NodeB1" nodeId="2">
<Level2 name="Node1B1" ImageId="Image11.png" nodeId="2" />
<Level2 name="Node1B2" ImageId="Image12.png" nodeId="2" />
</Level1>
<Level1 name="NodeB2" nodeId="3">
<Level2 name="SubNodeB2" nodeId="131">
<Level3 name="NodeB21" ImageId="Image21.png" nodeId="131" />
</Level2>
<Level2 name="NodeB13" ImageId="Image13.png" nodeId="3" />
<Level2 name="NodeB14" ImageId="Image14.png" nodeId="3" />
</Level1>
属性 class 存储 xml 结构,
private String nodeName;
private String name;
private String ImageId;
private int nodeId;
private String folderName;
在默认处理程序中,startElement 的以下代码用于处理节点和属性,
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
ListItems_Nodes node= new ListItems_Nodes();
if (qName.equalsIgnoreCase("Folder")) {
FolderName = attributes.getValue("name").toString();
}
nextLevelNode.setFolderName(FolderName);
nextLevelNode.setNodeName(qName);
nextLevelNode.setName(attributes.getValue("name").toString();
nextLevelNode.setChartId(attributes.getValue("ImageId").toString());
nextLevelNode.setNodeId(Integer.parseInt(attributes.getValue("nodeId")));
NodeLevelValues.add(nextLevelNode);
}
我可以使用任何文件夹的 ImageId 访问节点,因为它们与父节点具有相同的 nodeId,但如果节点具有非 Image 的子节点,则其 nodeId 与父节点不同,我无法访问访问特定的子节点。现在在 startElement 中,我正在考虑将父名称与每个节点 ID 一起存储。我已经为 Folder 节点实现了这个并且它工作正常但是对于其他节点如 Level1,Level2 .... Level(n) 我无法找到实现这个的方法。
我们将不胜感激任何帮助。谢谢
好像没有人有兴趣回答这个问题。我发现这不是一个愚蠢的问题,可能没有人知道如何解决这个问题。我找到了关于文档顺序索引的非常有用且有趣的文章,这篇文章解决了我的 parent/child 关系问题。这不仅解决了我的问题,而且由于这个原因,我的 100 多行代码 (checks/conditions) 现在缩短为只有 6 到 7 行代码。这篇文章可以在 http://www.ibm.com/developerworks/library/x-tipsaxdo2/ 找到。
我将简要描述它在我的应用程序中发生的变化。引入了两个全局变量,
private int m_nodeIx;
private Stack<Integer> m_parentStack;
还在我的 属性 class,
中添加了两个字段
private int nodeIndex;
private int parentIndex;
为我的 DefaultHandler 添加了 startDocument 方法,
public void startDocument() throws SAXException {
m_nodeIx = -1;
m_parentStack = new Stack<Integer>();
m_parentStack.push(Integer.valueOf(m_nodeIx));
}
在startElement中,
++ m_nodeIx;
int parentNodeIx = ((Integer) m_parentStack.peek()).intValue();
在填充完所有 属性 字段后,
propertyClass.setNodeIndex(m_nodeIx);
propertyClass.setParentIndex(parentNodeIx);
m_parentStack.push(Integer.valueOf( m_nodeIx ));
最后在我的 endElement 中,
m_parentStack.pop();
所以如果任何人想要拥有相同的功能,他们可以很容易地理解这里正在做什么。 (1) 现在每个节点都分配了一个索引。 (2) 每个子节点的父节点索引等于父节点的节点索引。我希望这对任何人都有用。 (很失望但很高兴自己解决)
我已经看到了这个问题,但没有得到回答,我希望这次我能走运。正如问题所述,我正在尝试使用 SAX 解析器解析 xml 并需要维护 parent/child 关系。由于 SAX 解析器是上下文无关的,所以我需要创建一些我自己的上下文。我已经完成了一半,但仍停留在这一点上。下面是我的 xml,
的示例结构<Folder name="Folder1" nodeId="1">
<Level1 name="NodeA1" nodeId="2">
<Level2 name="NodeA11" ImageId="Image11.png" nodeId="2" />
<Level2 name="NodeA12" ImageId="Image12.png" nodeId="2" />
</Level1>
<Level1 name="NodeA2" nodeId="3">
<Level2 name="SubNodeA2" nodeId="131">
<Level3 name="NodeA21" ImageId="Image21.png" nodeId="131" />
</Level2>
<Level2 name="NodeA13" ImageId="Image13.png" nodeId="3" />
<Level2 name="NodeA14" ImageId="Image14.png" nodeId="3" />
</Level1>
</Folder>
<Folder name="Folder2" nodeId="2">
<Level1 name="NodeB1" nodeId="2">
<Level2 name="Node1B1" ImageId="Image11.png" nodeId="2" />
<Level2 name="Node1B2" ImageId="Image12.png" nodeId="2" />
</Level1>
<Level1 name="NodeB2" nodeId="3">
<Level2 name="SubNodeB2" nodeId="131">
<Level3 name="NodeB21" ImageId="Image21.png" nodeId="131" />
</Level2>
<Level2 name="NodeB13" ImageId="Image13.png" nodeId="3" />
<Level2 name="NodeB14" ImageId="Image14.png" nodeId="3" />
</Level1>
属性 class 存储 xml 结构,
private String nodeName;
private String name;
private String ImageId;
private int nodeId;
private String folderName;
在默认处理程序中,startElement 的以下代码用于处理节点和属性,
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
ListItems_Nodes node= new ListItems_Nodes();
if (qName.equalsIgnoreCase("Folder")) {
FolderName = attributes.getValue("name").toString();
}
nextLevelNode.setFolderName(FolderName);
nextLevelNode.setNodeName(qName);
nextLevelNode.setName(attributes.getValue("name").toString();
nextLevelNode.setChartId(attributes.getValue("ImageId").toString());
nextLevelNode.setNodeId(Integer.parseInt(attributes.getValue("nodeId")));
NodeLevelValues.add(nextLevelNode);
}
我可以使用任何文件夹的 ImageId 访问节点,因为它们与父节点具有相同的 nodeId,但如果节点具有非 Image 的子节点,则其 nodeId 与父节点不同,我无法访问访问特定的子节点。现在在 startElement 中,我正在考虑将父名称与每个节点 ID 一起存储。我已经为 Folder 节点实现了这个并且它工作正常但是对于其他节点如 Level1,Level2 .... Level(n) 我无法找到实现这个的方法。
我们将不胜感激任何帮助。谢谢
好像没有人有兴趣回答这个问题。我发现这不是一个愚蠢的问题,可能没有人知道如何解决这个问题。我找到了关于文档顺序索引的非常有用且有趣的文章,这篇文章解决了我的 parent/child 关系问题。这不仅解决了我的问题,而且由于这个原因,我的 100 多行代码 (checks/conditions) 现在缩短为只有 6 到 7 行代码。这篇文章可以在 http://www.ibm.com/developerworks/library/x-tipsaxdo2/ 找到。
我将简要描述它在我的应用程序中发生的变化。引入了两个全局变量,
private int m_nodeIx;
private Stack<Integer> m_parentStack;
还在我的 属性 class,
中添加了两个字段private int nodeIndex;
private int parentIndex;
为我的 DefaultHandler 添加了 startDocument 方法,
public void startDocument() throws SAXException {
m_nodeIx = -1;
m_parentStack = new Stack<Integer>();
m_parentStack.push(Integer.valueOf(m_nodeIx));
}
在startElement中,
++ m_nodeIx;
int parentNodeIx = ((Integer) m_parentStack.peek()).intValue();
在填充完所有 属性 字段后,
propertyClass.setNodeIndex(m_nodeIx);
propertyClass.setParentIndex(parentNodeIx);
m_parentStack.push(Integer.valueOf( m_nodeIx ));
最后在我的 endElement 中,
m_parentStack.pop();
所以如果任何人想要拥有相同的功能,他们可以很容易地理解这里正在做什么。 (1) 现在每个节点都分配了一个索引。 (2) 每个子节点的父节点索引等于父节点的节点索引。我希望这对任何人都有用。 (很失望但很高兴自己解决)