Операции XML в памяти - PullRequest
0 голосов
/ 21 июня 2010

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

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.

Я нашел этот блог Эрика Уайта , который что-то делаетпохоже, но я до сих пор не совсем понимаю.Он использует 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 или чего-либо подобного.Я не вижу способа получить текст с узлов или обновить их.Я попытался привести узел, но он не скомпилировался.

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

Ответы [ 2 ]

1 голос
/ 21 июня 2010

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

1 голос
/ 21 июня 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...