3

我有一个包含文本信息的 200MB 大小的巨大 XML 文档。数据早先存储在具有 2 列的 pagemaker 文件中。标记后,我发现某些文本带有连字符。这是因为无法适应格式的单词被分解为 2 个由连字符分隔的单词。此 XML 文档还出于另一个原因使用连字符。分隔短句(用于注释)。

我想找出单词之间的那些连字符。我注意到我想要删除的连字符有一个标准模式。例如。

连字符的第一次使用 - (我要查找和替换)

questionques-tion answerans-wer

连字符的另一种用法是 - (未找到)

Pattern matchin - Regex Expressions - ...

所以两者的标准格式是 -

space-space

letter-letter

我如何使用 XQuery 找到所有这些,即第二个...或任何其他方式来找到它们...在巨大的 XML 文件中查找和替换这些...我的上帝..

4

1 回答 1

2

200 MB 不是很大。:)

如果您完全确定在标记/属性名称中找不到连字符,请使用 sed(不鼓励!):

sed -E 's/([[:alpha:]]+)\-([[:alpha:]]+)/\1\2/g' doc.xml out.xml

为此最好使用 XQuery,这样您就不必处理复杂的 XML 语法解析:

declare function local:copy-replace($element as element()) {  
  element {node-name($element)}  
          {$element/@*, 
        for $child in $element/node()  
        return
            if ($child instance of element())
            then local:copy-replace($child)  
            else replace($child, "(\w+)\-(\w+)","$1$2")
          }  
};

local:copy-replace(/*)

它还没有处理属性。如果连字符文本出现在属性中,您将不得不单独提取和包含它们。

在这个答案中,我很高兴地记住了一些不知名的用户作为一种模式。

于 2012-06-11T08:58:40.483 回答