当前位置: 首页 > 知识库问答 >
问题:

使用Sax解析器解析xml时的父/子关系

段干庆
2023-03-14

我已经看到了一个问题,但没有回答,我希望这次我能幸运。如问题所述,我试图用SAXParser解析xml,需要维护父/子关系。因为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>

一个属性类来存储xml结构,

private String nodeName;
private String name;
private String ImageId;
private int nodeId;
private String folderName;

在Default处理程序中,下面的starElement代码用于处理节点和属性,

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节点,因为它们与父节点具有相同的节点,但是如果一个节点有一个不是Image的子节点,那么它的节点与父节点不同,我无法访问特定的子节点。现在在starElement里面,我想用每个节点id来存储父名称。我已经为文件夹节点实现了这个,它工作正常,但是对于像Level1,Level2这样的其他节点......级别(n)我找不到实现这个的方法。

任何帮助将高度赞赏。谢啦

共有1个答案

宗政法
2023-03-14

似乎没有人有兴趣回答这个问题。我发现这不是一个愚蠢的问题,可能没有人知道如何解决这个问题。我发现关于文档顺序索引的文章非常丰富和有趣,这篇文章解决了我的父子关系问题。不仅这解决了我的问题,而且由于这一点,我的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));
}

在启动元素中,

++ m_nodeIx;
int parentNodeIx = ((Integer) m_parentStack.peek()).intValue();

填充所有属性字段后,

propertyClass.setNodeIndex(m_nodeIx);
propertyClass.setParentIndex(parentNodeIx);
m_parentStack.push(Integer.valueOf( m_nodeIx ));

最后在我的终点,

m_parentStack.pop();

因此,如果任何机构想要拥有相同的功能,他们可以很容易地理解这里正在做什么。(1)现在为每个节点分配一个Index。(2)每个子节点的父索引等于父节点的节点索引。我希望这对任何人都有用。(失望但乐意自己解决)

 类似资料:
  • 问题内容: 它很好用,但是我希望它返回一个包含所有字符串的数组,而不是最后一个元素返回一个字符串。 任何想法如何做到这一点? 问题答案: 因此,你想构建一个XML解析器来解析这样的RSS feed。 现在,你可以使用两个SAX实现。你可以使用org.xml.sax或android.sax实现。在发布简短的示例后,我将解释两者的优点和缺点。 android.sax Implementation 让我

  • 问题内容: 它很好用,但是我希望它返回一个包含所有字符串的数组,而不是最后一个元素返回一个字符串。 任何想法如何做到这一点? 问题答案: 因此,你想构建一个XML解析器来解析这样的RSS feed。 现在,你可以使用两个SAX实现。你可以使用org.xml.sax或android.sax实现。在发布简短的示例后,我将解释两者的优点和缺点。 android.sax实现 让我们从实现开始。 你首先必须

  • 主要内容:Java SAX解析器 解析XML文档的示例Java SAX解析器 解析XML文档的示例 需要解析的文件input.xml 编写DefaultHandler的事件处理程序 编写核心解析处理类 输出结果为:

  • 问题内容: 我有一个XML文件,我需要在其中搜索特定的标签并更新其值。问题在于,使用Sax解析器是“必须的”。我必须通过“仅”使用Sax解析器来找到这些标签,dom stax j4dom dom4j解析器不在考虑范围之内。 我可以通过将xml文件转换为字符串并使用sax解析器对其进行解析并按对象附加新值来完成此任务吗?可以吗 或您会推荐什么? 问题答案: 这是一个有效的代码,只需添加缺少的导入。它

  • 问题内容: 我正在从REST服务接收XML文档,该文档将使用SAX进行解析。请参见以下示例,它是从XSD生成的。 设置解析器不是问题。我的主要问题是在实际的处理,方法等,我不知道如何提取我需要的项目,并将其作为他们有些“嵌套”。 例 所述可发生一次或两次,并且可以包含任意数量的其-in了转向有关于一个连接的信息的元素。基本上,我需要与他们的所有连接的列表,和。我必须为每个元素创建一个类吗? 就我所

  • 问题内容: 我目前正在使用SAX(Java)来解析少量不同的XML文档,每个文档代表不同的数据,并且结构略有不同。因此,每个XML文档都由不同的SAX类(子类)处理。 但是,在所有这些不同的文档中可能会出现一些XML结构。理想情况下,我想告诉解析器“嘿,当你到达一个元素,只要使用阅读它,并给我回的结果。如果你达到,使用读它,并给我回的是结果”。 但是,我看不到这样做的明显方法。 我是否应该只制作一

  • 问题内容: 我正在用SAX解析XML文件,有时需要元素的内部XML。例如,对于以下XML 我需要获取元素 a 的内部XML ,这将是 最简单的方法是什么? 谢谢。 伊万 问题答案: 对于这种情况,我建议使用2个内容处理程序。第一个负责查找文档的相关部分,第二个负责处理内容。我对类似问题的答案(请参见下面的链接)演示了如何实现此方法: 使用SAX解析常见的XML元素

  • 主要内容:Java SAX解析器 修改XML文档的示例Java SAX解析器 修改XML文档的示例 需要修改的文件input.xml 编写修改XML文档的解析处理类 控制台输出结果为: 在项目根目录下生成新的文件input-updated.xml,内容如下: