我有一个200MB大小的XML文档,其中包含文本信息。数据先前存储在包含2列的pagemaker文件中。标记后我发现某些文本有连字符。这是因为无法符合格式的单词被用连字符分隔的2个单词分解。此XML文档也使用连字符是另一个原因。分开短句(适用于笔记)。
我想找出这两个词之间的连字符。我注意到我想要找到删除的连字符有一个标准模式。例如。
第一次使用连字符 - (我想找到并替换)
question
是ques-tion
answer
将是ans-wer
连字符的其他用法是 - (未找到)
Pattern matchin - Regex Expressions - ...
因此两者的标准格式是 -
space-space
letter-letter
如何使用XQuery查找所有这些,即第二个...... 或者找到它们的任何其他方式......在巨大的XML文件中找到并替换它们......我的上帝......
答案 0 :(得分:2)
200 MB并不大。 :)
如果你完全确定在tag- / attribute-names中找不到连字符,请使用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(/*)
它还没有处理属性。如果在属性中出现带连字符的文本,则必须单独提取并包含它们。
有些学分转到some unknown user in this answer我很乐意记住这种模式。
答案 1 :(得分:-2)
XPath 2.0支持regular expression matching。调整this question的答案我会尝试XPath表达式,如:
//*[matches(.,'[a-zA-Z]-[a-zA-Z]')]
我使用Kernow实用程序测试了该表达式,版本1.7.2可用here。
输入:
<list>
<item>should not match - </item>
<item>hel-lo</item>
<item>wor-ld</item>
</list>
它返回了:
<?xml version="1.0" encoding="UTF-8"?>
<item>hel-lo</item>
<item>wor-ld</item>