2010-06-21 2 views
0

Я пытаюсь найти и заменить в текстовом документе OpenXML, который я открыл в MemoryStream.Обработка XML в памяти

using (WordprocessingDocument _document = WordprocessingDocument.Open(_ms, true)) 
{ 
    var placeHolder = _document.MainDocumentPart.Document 
          .Descendants<DocumentFormat.OpenXml.Wordprocessing.Text>() 
          .Where(node => node.InnerText.Contains("***PlaceHolderText***")) 
          .FirstOrDefault(); 

    placeHolder.InnerText.Replace("***PlaceHolderText***", "hello world!"); 
} 

Это не работает. Я не уверен, почему, но манипулирование документом таким образом не кажется , чтобы повлиять на MemoryStream.

Я нашел this blog by Eric White, который делает что-то подобное, но я все еще не могу это получить. Он использует XDocument, поэтому у меня есть что-то вроде следующего:

XDocument doc = _document.MainDocumentPart.GetXDocument(); // this is an extension method 
var textNodes = doc.DescendantNodes().Where(n => n.NodeType == XmlNodeType.Text); 

Это находит правильные узлы в моем документе, но проблема в настоящее время я не могу работать, как изменить текст. System.Xml.Linq.XNodes, которым я в конечном итоге так (вместо нужных мне DocumentFormat.OpenXml.Wordprocessing.Text узлов) не имеет свойства InnerText или Value или что-то в этом роде. Я не вижу способа получить текст из узлов или обновить их. Я попробовал лить узел, но это не скомпилировалось.

Я даже иду в правильном направлении? Или есть более простой способ? Любые указатели были бы очень благодарны, спасибо.

ответ

1

Я, наконец, получил эту работу. Принимая первый фрагмент кода, последняя строка должна читать placeHolder.Text, а не placeHolder.InnerText. Не могу поверить, что я потратил 4 часа на это! :(

1

В первую очередь (обновление MemoryStream). Вы должны думать о потоке памяти как прочитанный только по мере того, как он передается методу Open. Парсер прочитал поток и построил другое в представлении памяти, которое не подключено к его входному потоку. Вам придется записать его обратно, используя Save.

Что касается манипулирования текстовым контентом XNode, вы ищете XText.Value.

+0

«Вам нужно будет написать его обратно с помощью« Сохранить »- о том, какой метод Save вы говорите? –

+0

такой, как этот http://msdn.microsoft.com/en-us/library/cc838778.aspx – dkackman

Смежные вопросы