在给定位置的无效XML字符串中查找父元素

时间:2013-02-21 14:57:04

标签: xml regex

示例:

...some string content here...
<test>
    <a>
        ...something...
    </a>
    <a/>
    {position 1}
    <b>{position 2}
        <c>
            ...something else...
            {position 3}
        </c>
        <c/>
        <d>
            <e/>
            {position 4}
            <e>
                ...another thing here...
                {position 5}
            </e>
        </d>
        {position 6}
    </b>
    {position 7}
...more xml and other sting content...
  

我需要在(例如)位置找到父封闭元素   如上所述。

     

结果将是:{position 1} = test {position 2} = b {position   3} = c {position 4} = d {position 5} = e {position 6} = b {position 7}   =测试

     

说明:    - 没有任何元素标记名称已知    - 孔串可以包括非xml内容    - 数据的大小非常大(> 50MB文本文件)

必须有一种搜索技术,从给定位置开始向后读取,直到找到有效匹配(如果有)。

感谢名单

1 个答案:

答案 0 :(得分:1)

根据定义,无法解析无效的XML。这就是为什么任何XML解析器都会拒绝解析它并返回错误。

如果XML解析器无法解析它,你也不能(基本上)。你要求的不是一些简单的字符串或简单的标签集合,可以被正则表达式抓取。你真的必须做一个完整的解析(可能是无效的数据!),以便在特定的位置找到父标签。

更新:,看看我在说什么,考虑在您的示例中找到{position 1}的父级。

  • 解决此问题的简单方法可能是“向后查找开始标记”。但是你显然无法获得你找到的第一个开头标记(<a>),因为它在该位置之前关闭。
  • 因此,当您向后移动时,您必须看到</a>,并记住<a>标记已关闭,因此您不会将<a>视为父级。
  • 当然,在你到达父母之前,可能会有任意数量的打开和关闭标签。您必须跟踪所有这些(包括多次出现的相同标记)。

如您所见,这非常复杂。这是在您允许文件中的任何无效元素之前。

一种可行的简单方法:如果您确切知道文件错误是什么,则可以删除这些错误,然后将更正后的文件提供给XML解析器。

否则,您必须为特定品牌的无效XML编写自己的自定义解析器。它甚至可能不可能,具体取决于文件中的错误类型。