繁体   English   中英

使用Sax Parser解析xml中的父/子关系

[英]Parent/Child relationship in parsing xml with Sax Parser

我已经看到了有关此问题的信息,但尚未得到答复,希望这次我能走运。 正如问题所述,我试图使用SAX Parser解析xml,并且需要维护父/子关系。 由于SAX Parser不受上下文限制,因此我需要创建自己的上下文。 我已经完成了一半,但目前仍停留在此。 下面是我的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>

一个用于存储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访问节点,因为它们的节点ID与父节点相同,但是如果节点的子节点不是Image,则其nodeId与父节点不同,并且我无法访问特定的子节点。节点。 现在,在startElement内部,我正在考虑将父名称与每个节点ID一起存储。 我已经为Folder节点实现了此功能,并且工作正常,但对于其他节点,例如Level1,Level2...。Level(n)我无法找到实现此目的的方法。

任何帮助将不胜感激。 谢谢

似乎没人愿意回答这个问题。 我发现这不是一个愚蠢的问题,也许没人知道如何解决这个问题。 我发现有关文档顺序索引的文章非常有用且有趣,这篇文章解决了我的父子关系问题。 这不仅解决了我的问题,而且由于这个原因,我的100多行代码(检查/条件)现在缩短为仅6至7行代码。 可以在http://www.ibm.com/developerworks/library/x-tipsaxdo2/中找到该文章。

我将简要描述它在我的应用程序中发生了什么变化。 引入了两个全局变量,

private int m_nodeIx;
private Stack<Integer> m_parentStack;

还向我的媒体资源类添加了两个字段,

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)每个子节点的父索引等于父节点的节点索引。 我希望这对任何人都有用。 (很失望,但很乐意自己解决)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM