Почему мой пользовательский XML не переносится в новую версию файла DOCX, когда Word сохраняет его? - PullRequest
7 голосов
/ 14 июня 2011

Я добавляю некоторый пользовательский XML в docx для отслеживания его внутри приложения, которое я пишу.

Я сделал это вручную, открыв документ Word через библиотеку ZIP и по официальному маршруту Open XML SDK. Оба имеют одинаковый результат того, что мой XML был вставлен в папку customXml в документе. Документ прекрасно открывается в Word для обоих этих методов, и XML присутствует.

НО, когда я сохраняю документ как MyDoc2.docx, например, все мои XML исчезают.

Что я делаю не так?

Ссылки Microsoft, на которые я перешел:

http://msdn.microsoft.com/en-us/library/bb608597.aspx
http://msdn.microsoft.com/en-us/library/bb608612.aspx

И код, который я взял из Open XML SDK 2.0:

public static void AddNewPart(string document, string fileName)
{
    using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, true))
    {
        MainDocumentPart mainPart = wordDoc.MainDocumentPart;

        CustomXmlPart myXmlPart = mainPart.AddCustomXmlPart(CustomXmlPartType.CustomXml);

        using (FileStream stream = new FileStream(fileName, FileMode.Open))
        {
            myXmlPart.FeedData(stream);
        }
    }
}

Спасибо, John

1 Ответ

5 голосов
/ 15 июня 2011

Хорошо, поэтому мне удалось найти следующую статью Использование пользовательской части XML в качестве хранилища данных на openxmldeveloper.org, и я удалил ненужный код для вставки и сохранения пользовательского XML:

static void Main(string[] args)
{
    using (WordprocessingDocument doc = WordprocessingDocument.Open("Test.docx", true, new OpenSettings()))
    {
        int customXmlPartsCount = doc.MainDocumentPart.GetPartsCountOfType<CustomXmlPart>();

        if (customXmlPartsCount == 0)
        {
            CustomXmlPart customXmlPersonDataSourcePart = doc.MainDocumentPart.AddNewPart<CustomXmlPart>("application/xml", null);
            using (FileStream stream = new FileStream("Test.xml", FileMode.Open))
            {
                customXmlPersonDataSourcePart.FeedData(stream);
            }


            CustomXmlPropertiesPart customXmlPersonPropertiesDataSourcePart = customXmlPersonDataSourcePart
                                                                              .AddNewPart<CustomXmlPropertiesPart>("Rd3c4172d526e4b2384ade4b889302c76");

            Ds.DataStoreItem dataStoreItem1 = new Ds.DataStoreItem() { ItemId = "{88e81a45-98c0-4d79-952a-e8203ce59aac}" };
            customXmlPersonPropertiesDataSourcePart.DataStoreItem = dataStoreItem1;
        }
    }
}

Так что все примеры от Microsoft работают до тех пор, пока вы не измените файл.Проблема заключается в том, что мы не устанавливаем отношения с Основным документом.

...