使用MS Word XML

时间:2009-11-23 10:01:52

标签: .net xml vb.net ms-word

我总是很难理解(尤其是英语不是我的第一语言)解释,我的问题是什么,所以我很抱歉提前复杂或过于琐碎;)。

我需要做的是以特定方式“解析”Word XML文档。转换为xml的文档有一些部分将放在某些固定标记之间,如[...]或/ * ... * /或者其他什么,我需要它们作为一个文本块保留,而Word来自:

[SOME_TEXT.SOME_OTHER_TEXT]

做了类似的事情:

<w:r>
    <w:rPr><not relevant /></w:rPr>
    <w:t>
        [SOME_TEXT.
    </w:t>
</w:r>
<w:r>
    <w:rPr><not relevant /></w:rPr>
    <w:t>
        SOME_OTHER_TEXT
    </w:t>
</w:r>
<w:r>
    <w:rPr><not relevant /></w:rPr>
    <w:t>
        ]
    </w:t>
</w:r>

而不是例如:

<w:r>
    <w:rPr><not relevant /></w:rPr>
    <w:t>
        [SOME_TEXT.SOME_OTHER_TEXT]
    </w:t>
</w:r>

我尝试将Application.Options.StoreRSIDOnSave设置为false,对所有文本使用通用格式,关闭拼写检查等,但Word仍“随机”分割一些字符串(特别是当它们粘贴时)在其他地方,不是手工编写的) - 我不能告诉那些将要创建这些xml文档的人,在他们可以在我的应用程序中使用他们的文件之前做一百件其他事情。所以我需要自己负责准备文件。我想知道什么是最好的,尽可能简单的解决方案 - 通过XmlDocument读取它,循环遍历节点并删除它们,注意关闭那些需要关闭并放入/ * ... * /之间干净或做同样但通过将文件作为纯文本阅读。或者也许有人有更好的想法(比如一些聪明的正则表达式))?我将非常感谢所有的帮助。

//修改 我设法解决了这个问题。我的解决方案可能有点'跛脚',但效果很好;)

Dim MyMarkedString As Boolean = False
Dim MyTextOpened As Boolean = False
Dim MyFile As String = File.ReadAllText(pFileName)
Dim MyFileCopy As String = String.Empty
For Each foundPart As Match In Regex.Matches(MyFile, "((<\??/?)(?:[^:\s>]+:)?(\w+).*?(/?\??>))|(?!<)(\[?((?!<).)+\]?)")
    If (foundPart.Value.Equals("<w:t>") OrElse foundPart.Value.Contains("<w:t ")) AndAlso Not MyMarkedString Then
        MyTextOpened = True
        MyFileCopy += foundPart.Value
    ElseIf (foundPart.Value.Equals("</w:t>") OrElse foundPart.Value.Contains("</w:t ")) AndAlso Not MyMarkedString Then
        MyTextOpened = False
        MyFileCopy += foundPart.Value
    ElseIf (foundPart.Value.Equals("<w:t>") OrElse foundPart.Value.Contains("<w:t ")) AndAlso MyMarkedString Then
        MyTextOpened = True
        MyFileCopy += ""
    ElseIf (foundPart.Value.Equals("</w:t>") OrElse foundPart.Value.Contains("</w:t ")) AndAlso MyMarkedString Then
        MyTextOpened = False
        MyFileCopy += ""
    Else
        If MyTextOpened AndAlso Not MyMarkedString Then
            If foundPart.Value.Contains("[") AndAlso Not foundPart.Value.Contains("]") Then MyMarkedString = True
            MyFileCopy += foundPart.Value
        ElseIf MyTextOpened AndAlso MyMarkedString Then
            If foundPart.Value.Contains("]") AndAlso Not foundPart.Value.Contains("[") Then MyMarkedString = False
            MyFileCopy += foundPart.Value
        ElseIf Not MyTextOpened And MyMarkedString Then
            MyFileCopy += ""
        Else
            MyFileCopy += foundPart.Value
        End If
    End If
Next
File.WriteAllText(pCopyName, MyFileCopy)

2 个答案:

答案 0 :(得分:2)

我可以建议另一种方法:将XML作为纯String读取,删除所有XML元素并检查生成的字符串。

Imports System.IO
Imports System.text.RegularExpressions

Dim readFile As String = File.ReadAlltext("yourPathToFile.doc")
readFile = Regex.Replace(readFile, "<[a-zA-Z0-9/:]+>", String.Empty)

For Each foundPart As Match In Regex.Matches(readFile, "\[[a-zA-Z0-9]+\]")
        ' do something here with the things we found'
Next

可能还需要一些额外的东西,例如:替换空间等。

编辑:是的,我知道RegEx Expression远非完美......

编辑2: RegEx to remove XML Tags with content

答案 1 :(得分:0)