2011-08-19 86 views
3

在我已经存储的复杂XML中,就像String一样,我必须进行一些text/xml处理。目标是找到节点的起始索引节点。除了节点(节点/元素类参考)我也有关于嵌套信息:整数的数组说,在哪个孩子应该介入。例如。数组:XML文本处理

2 1 0 

而定树

root 
    |--root-child0 
    |--root-child1 
    |--root-child2 
     |--root-child2-child0 
     |--root-child2-child1 
        |--root-child2-child1-child0 

我寻找根的child2-child1-child0

是否有任何干净可能性找到这样的项目。只是字符串查找(String.indexOf())是不够的 - 在我的XML文件中有许多相同的标签。除此之外,还存在一个额外的困难 - 在一些父母和子女之间可以存在一个额外的标签(收藏)。 (如根的child2唯一的孩子可能是收集和根的child2-child0和根的child2-child1此收藏的儿童)

--edit

如果这能帮助 - 除了上面提到的嵌套信息之外,我还可以获得与正在搜索的节点的路径上的节点相对应的节点名称。

--edit 2

有了这样的xml文件

<catalog> 
    <book id="bk101"> 
     <author>Gambardella, Matthew</author> 
     <title>XML Developer's Guide</title> 
     <genre>Computer</genre> 
    </book> 
    <book id="bk102"> 
     <author>Ralls, Kim</author> 
     <title>Midnight Rain</title> 
     <genre>Fantasy</genre> 
     <price>5.95</price> 
    </book> 
</catalog> 

假设我Node对象引用以价格标签有值5.95。 Additionaly我对嵌套信息:

1 3 

说,这是第二次(从0记数)的书的目录和标签来回在这本书(ID =“bk102”)。

我要的是为什么我不能用这个简单的方法来得到类似

xmlRawBody.indexOf("<price>5.95</price>"). 

?因为有可能相同的标签会出现在其他地方。我必须使用提到的附加嵌套信息。

+0

只是想知道你为什么想知道一个给定节点的xml文件的字符的数据流中的位置? – gigadot

+0

在编辑 –

+1

选择它据我知道,因为当你想操作DOM对象不需要他们,有关位置的信息的XML解析后丢失。大多数XML编辑器使用较低级别的解析器来处理这个问题,例如,带有XML语法的ANTLR。 – gigadot

回答

2

我的理解是,你有如2 1 0的信息。由此,您正在创建节点root-child2-child1-chile0的名称。

要获得像这样的指定节点,如果结构是固定的,那么你可以从中创建一个xpath。

例如,如果您的值为2 1 0,那么请构建xpath,如root/root-child2/root-child2-child1/root-child2-child1-child0。您可以使用此xpath来获取特定的节点元素。

您可以创建一个java函数,它根据相应的给定数组值来准备xpath。如果你有更多这样的元素,你需要找到一种方法来用xpath来识别它们。由于的XPath很容易获取使用SAXParser(如果你不想读取整个XML,只有一部分,然后使用SAXParser)这样的值。

希望这会有所帮助。

+0

不幸的是,这与节点名称无关。我已经有Node对象,我正在寻找,并且我有嵌套信息。最后一个输入是String XML主体。我想得到的是起始节点标记的'<'符号的索引。 –

+0

我也可以获得关于节点名称的信息。但我不确定XPath是否可以帮助我找到字符串索引。 –

+0

为了我的理解,您是否想要将XML分成几部分?或者想从中读取一些XML块?你能解释一下吗,这样我就可以把它联系起来...... thx – Parth

0

将您的阵列到XPath和使用您所选择的XPath引擎。例如2 1 0将变为:/*[3]/*[2]/*[1]。请注意,XPath位置是基于1的,所以你必须添加一个到每个索引...

此外,XPath引擎将返回一个DOM节点,你可以做任何你想要的。获取此节点的字符或字节偏移不是DOM和XPath规范的一部分,因此它取决于实现。在大多数情况下,你不能这样做,因为在大多数你不在乎的应

+0

正如我之前说过,我已经**有**节点引用,所以通过XPath获取它是完全不必要的 –