2009-11-23 71 views
0

对我来说总是很难理解(特别是在英语中,这不是我的第一语言)解释,我的问题是什么,所以我提前抱歉错综复杂或过分琐碎;)。使用MS Word XML

我需要做的是以特定的方式“解析”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,使用普通格式的所有文本,关掉咒语cking等,但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

可能我建议另一种方法:读取XML作为一个纯粹的字符串,删除所有的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 

可能需要一些额外的东西,f.e.更换空间等

编辑:是的,我明白,正则表达式表达是远远不够完善这个...

EDIT2:RegEx to remove XML Tags with content

+0

其实我试图想出一些正则表达式,我可以用 - 希望这不是一个黑暗的角落;) – brovar 2009-11-23 10:36:19

+0

我也发现了这个问题,也许它可以帮助:HTTP:// stackoverflow.com/questions/121656/regular-expression-to-remove-xml-tags-and-their-content – Bobby 2009-11-23 10:52:57