Потомки <T>получают ноль элементов в Word doc - PullRequest
0 голосов
/ 23 января 2019

У меня проблемы с обновлением гиперссылки в документе Word (Q Как обновить тело и гиперссылку в документе Word ), и увеличение масштаба вызова Descendants<T>() не работает. Вот мой код:

using DocumentFormat.OpenXml.Packaging;      //from NuGet ClosedXML
using DocumentFormat.OpenXml.Wordprocessing; //from NuGet ClosedXML

WordprocessingDocument doc = WordprocessingDocument.Open(...filename..., true);
MainDocumentPart mainPart = doc.MainDocumentPart;
IEnumerable<Hyperlink> hLinks = mainPart.Document.Body.Descendants<Hyperlink>();

Документ открыт в порядке, потому что mainPart получает значение. Но hLinks не имеет элементов. Если я открываю документ Word в Word, гиперссылка присутствует и работает.

В Immediate Window я вижу следующие значения:

mainPart.Document.Body
-->
{DocumentFormat.OpenXml.Wordprocessing.Body}
    ChildElements: {DocumentFormat.OpenXml.OpenXmlChildElements}
    ExtendedAttributes: {DocumentFormat.OpenXml.EmptyEnumerable<DocumentFormat.OpenXml.OpenXmlAttribute>}
    FirstChild: {DocumentFormat.OpenXml.OpenXmlUnknownElement}
    HasAttributes: false
    HasChildren: true
    InnerText: "
       lots of data, e.g:
    ...<w:t>100</w:t>...

mainPart.Document.Body.Descendants<Text>().First()
-->
Exception: "Sequence contains no elements"

Если я даже не могу найти части текста, как мне найти и заменить гиперссылку?

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Что-то не так с моим документом Word;он был создан с помощью инструмента.Тестирование с помощью другого документа Word, созданного с помощью Word, дает лучшие результаты.Я работаю над этим ...

С обычным документом Word, глядя на

doc.MainDocumentPart.Document.Body.InnerXml

значение начинается с:

<w:p w:rsidR=\"00455325\" w:rsidRDefault=\"00341915\" 
  xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\">
  <w:r>
    <w:t>Hello World!

, но со словом docЯ тестирую с помощью инструмента, который я сам сделал:

<w:body xmlns:w=\"http://schemas.openxmlforma...

Это многое объясняет.Мне придется исправить мой инструмент: -)


Обновление:

Исправлено то, что это не давало правильную часть данных для вставки в Word Doc:

string strDocumentXml = newWordContent.DocumentElement.InnerXml;

но вместо этого это правильные данные:

string strDocumentXml = newWordContent.DocumentElement.FirstChild.OuterXml;

Проверка с помощью отладчика:

doc.MainDocumentPart.Document.Body.InnerXml

, как указано выше, подтвердила это.Вызов Descendants теперь возвращает ожидаемые данные, и обновление гиперссылки работает.


Примечание:

Я четко исправил ошибку в своем приложении, но, помимо обновления гиперссылки,раньше приложение работало нормально, с этой ошибкой: -)

0 голосов
/ 24 января 2019

Если вы уверены, что в вашем файле есть элементы, которые вы ищете с помощью linq, и ничего не возвращается или вы получаете исключения, это обычно указывает на проблему с пространством имен.

Если вы опубликуете весь файл, я могу вам помочь, но проверьте, можете ли вы использовать псевдоним своего пространства имен следующим образом:

using W = DocumentFormat.OpenXml.Wordprocessing;

и затем в вашем Descendants звонке вы делаете что-то вроде этого:

var hLinks = mainPart.Document.Body.Descendants<W.Hyperlink>();

Этот ответ демонстрирует еще одну хитрость пространства имен, которую можно попробовать.

...