working with MS Word XML
It's always hard for me to understandably (especially in English which isn't my first language) explain, what my problem is, so I'm sorry in advance for intricacy or excessive triviality ;).
What I need to do is to 'parse' Word XML document in a specific way. The document converted to xml has some parts that will be put between some fixed marks like [ ... ] or /* ... */ or whatever and I need them to stay as a one block of text each, while Word from:
[SOME_TEXT.SOME_OTHER_TEXT]
makes something like:
<w:r>
<w:rP开发者_如何学Gor><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>
instead of e.g.:
<w:r>
<w:rPr><not relevant /></w:rPr>
<w:t>
[SOME_TEXT.SOME_OTHER_TEXT]
</w:t>
</w:r>
I've tried to set Application.Options.StoreRSIDOnSave to false, use common formatting for all the text, switch off the spell checking, etc. but Word still "randomly" splits some strings (especially when they're pasted from somewhere else, not written by hand) - and I cannot tell people, who are going to create those xml docs, to do a hundred other things before they can use their file in my app. So I need to take care of preparing the document by myself. I'm wondering what would be the best and as simple as possible solution to do this - read it through XmlDocument, loop through the nodes and remove them taking care to close the ones that need to be closed and put /* ... */ between clean or do the same but by reading the file as pure text. Or maybe someone has some better idea (like some clever regex ;))? I'll be very grateful for all the help.
//edit I managed to solve the problem. My solution is maybe a little 'lame' but works perfectly ;)
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)
May i suggest another way: Read the XML as a pure String, remove all XML-Elements and check the resulting string.
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
Some additional things might be needed, f.e. replacing spaces etc.
Edit: Yes, I understand that the RegEx Expression is far from perfect for this...
Edit2: RegEx to remove XML Tags with content
What about this SDK?
http://www.microsoft.com/downloads/details.aspx?FamilyId=C6E744E5-36E9-45F5-8D8C-331DF206E0D0&displaylang=en
精彩评论