Ms word 使用OpenXMLAPI更新word Customxml部分,但可以';t更新“;document.xml“;在主要文件中

Ms word 使用OpenXMLAPI更新word Customxml部分,但可以';t更新“;document.xml“;在主要文件中,ms-word,openxml-sdk,docx4j,Ms Word,Openxml Sdk,Docx4j,我们使用C代码更新自定义xml部件。我们正在widows中成功更新文档。但我们可以在Linux环境下打开此文档,它的值无法更改 如何在windows中实现自定义xml部分以及word文件夹中Document.xml的更改?使用另一个问题中稍微增强的示例,假设您有一个MainDocumentPart(/word/Document.xml)和一个数据绑定w:sdt(注意这是一个块级结构化文档标记)(SDT)在本例中包含w:p;它也可以是w:p中包含的内联级SDT) 价值1 我们的MainDocu

我们使用C代码更新自定义xml部件。我们正在widows中成功更新文档。但我们可以在Linux环境下打开此文档,它的值无法更改


如何在windows中实现自定义xml部分以及word文件夹中Document.xml的更改?

使用另一个问题中稍微增强的示例,假设您有一个
MainDocumentPart
/word/Document.xml
)和一个数据绑定
w:sdt
(注意这是一个块级结构化文档标记)(SDT)在本例中包含
w:p
;它也可以是
w:p
中包含的内联级SDT)


价值1
我们的
MainDocumentPart
引用了以下
CustomXmlPart
/customXML/item.xml
):


价值1
上述
CustomXmlPart
引用了以下
CustomXmlPropertiesPart
/customXML/itemProps1.xml
):


这种情况下的“增强”是顶部
MainDocumentPart
中的附加
w:tag
元素。此
w:tag
元素是在
w:sdt
元素和它绑定到的自定义XML元素(例如,
ex:Node
)之间创建易于使用的链接的一种方法。在本例中,值
节点
恰好是
ex:Node
元素的本地名称

最后,这里是一个工作代码示例,演示如何更新
CustomXmlPart
MainDocumentPart

[事实]
public void可以更新StomxmlandMainDocumentPart()
{
//定义自定义XML元素的初始值和更新值,并
//数据绑定为w:sdt元素。
常量字符串initialValue=“VALUE1”;
常量字符串updatedValue=“value2”;
//使用初始值创建自定义XML部件的根元素。
var customXmlRoot=
新XElement(Ns+“根”,
新的XAttribute(XNamespace.Xmlns+NsPrefix,NsName),
新的XElement(Ns+“节点”,初始值));
//使用初始值创建w:sdt的w:sdtContent子元素。
var SDT内容=
新条款(W.SDT内容,
新XElement(W.p,
新XElement(W.r,
新元素(W.t,初始值));
//使用初始值创建WordprocessingDocument。
使用var stream=newmemoryStream();
使用(WordprocessingDocument wordDocument=WordprocessingDocument.Create(流,类型))
{
初始化WordProcessingDocument(wordDocument、customXmlRoot、sdtContent);
}
//断言WordprocessingDocument具有预期的初始值。
使用(WordprocessingDocument wordDocument=WordprocessingDocument.Open(stream,true))
{
资产价值是预期的(wordDocument,initialValue);
}
//使用更新的值更新WordprocessingDocument。
使用(WordprocessingDocument wordDocument=WordprocessingDocument.Open(stream,true))
{
MainDocumentPart MainDocumentPart=wordDocument.MainDocumentPart;
//再次使用简化假设更改自定义XML元素
//我们只有一个自定义XML部分和一个ex:Node
//元素。
CustomXmlPart CustomXmlPart=mainDocumentPart.CustomXmlParts.Single();
XElement root=customXmlPart.GetXElement();
XElement节点=根.Elements(Ns+“节点”).Single();
node.Value=updatedValue;
customXmlPart.PutXDocument();
//更改MainDocumentPart中包含的w:sdt。
XElement document=mainDocumentPart.GetXElement();
XElement sdt=FindSDWithTag(“节点”,文档);
sdtContent=sdt.Elements(W.sdtContent.Single();
sdtContent.ReplaceAll(
新XElement(W.p,
新XElement(W.r,
新元素(W.t,updatedValue));
mainDocumentPart.PutXDocument();
}
//断言WordprocessingDocument具有预期的更新值。
使用(WordprocessingDocument wordDocument=WordprocessingDocument.Open(stream,true))
{
资产价值是预期的(wordDocument,updatedValue);
}
}
私有静态无效初始化WordProcessingDocument(
WordprocessingDocument wordDocument,
XElement自定义XmlRoot,
XElement SDT内容)
{
MainDocumentPart MainDocumentPart=wordDocument.AddMainDocumentPart();
string storeItemId=CreateCustomXmlPart(mainDocumentPart,customXmlRoot);
mainDocumentPart.PutXDocument(新XDocument(
新XElement(W.文件,
新的XAttribute(XNamespace.Xmlns+“w”,w.w.NamespaceName),
新XElement(W.body,
新XElement(W.sdt,
新XElement(W.sdtPr,
新的XElement(W.tag,新的XAttribute(W.val,Node)),
新XElement(W.数据绑定,
新的XAttribute(W.prefixMappings,$“xmlns:{NsPrefix}='{NsName}'”,
新的XAttribute(W.xpath,$“{NsPrefix}:Root[1]/{NsPrefix}:Node[1]”,
新的XAttribute(W.storeItemID,storeItemID)),
SDT内容(()());;
}
私有静态无效资产价值是预期的(
WordprocessingDocument wordDocument,
字符串(期望值)
{
//检索w:sdt元素的内部文本。
MainDocumentPart MainDocumentPart=wordDocument.MainDocumentPart;
XElement sdt=FindSDWithTag(“节点”,mainDocumentPart.GetXElement());
字符串sdtInnerText=GetInnerText(sdt);
//检索自定义XML元素的内部文本,使
//假设我们只有一个自定义XML部分