0

例子:

...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} = test

备注: - 不知道任何元素标签名称 - 孔字符串可能包含非 xml 内容 - 数据大小非常大(>50MB 文本文件)

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

谢谢

4

1 回答 1

1

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

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

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

  • 解决这个问题的一个简单的开始方法可能是“倒退并找到开始标签”。但是你显然不能取你找到的第一个开始标签 ( <a>),因为它在仓位之前关闭。
  • 所以,当你往回走时,你必须看到</a>并记住<a>标签是关闭的,这样你就不能算作<a>父级了。
  • 当然,在您到达父级之前,可能会有任意数量的打开和关闭标签。您必须跟踪所有这些(包括同一标签的多次出现)。

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

一种可能有效的简单方法:如果您确切知道文件错误是什么,您可以删除这些错误,然后将更正后的文件输入 XML 解析器。

否则,您将不得不为特定品牌的无效 XML 编写自己的自定义解析器。根据文件中错误的类型,它甚至可能是不可能的。

于 2013-02-21T15:18:13.033 回答