internal static void UpdateCorePropertyValue(DocX document, string corePropertyName, string corePropertyValue)
{
string matchPattern = string.Format(@"(DOCPROPERTY)?{0}\\\*MERGEFORMAT", corePropertyName).ToLower();
foreach (XElement e in document.mainDoc.Descendants(XName.Get("fldSimple", w.NamespaceName)))
{
string attr_value = e.Attribute(XName.Get("instr", w.NamespaceName)).Value.Replace(" ", string.Empty).Trim().ToLower();
if (Regex.IsMatch(attr_value, matchPattern))
{
XElement firstRun = e.Element(w + "r");
XElement firstText = firstRun.Element(w + "t");
XElement rPr = firstText.Element(w + "rPr");
// Delete everything and insert updated text value
e.RemoveNodes();
XElement t = new XElement(w + "t", rPr, corePropertyValue);
Novacode.Text.PreserveSpace(t);
e.Add(new XElement(firstRun.Name, firstRun.Attributes(), firstRun.Element(XName.Get("rPr", w.NamespaceName)), t));
}
}
#region Headers
IEnumerable<PackagePart> headerParts = from headerPart in document.package.GetParts()
where (Regex.IsMatch(headerPart.Uri.ToString(), @"/word/header\d?.xml"))
select headerPart;
foreach (PackagePart pp in headerParts)
{
XDocument header = XDocument.Load(new StreamReader(pp.GetStream()));
foreach (XElement e in header.Descendants(XName.Get("fldSimple", w.NamespaceName)))
{
string attr_value = e.Attribute(XName.Get("instr", w.NamespaceName)).Value.Replace(" ", string.Empty).Trim().ToLower();
if (Regex.IsMatch(attr_value, matchPattern))
{
XElement firstRun = e.Element(w + "r");
// Delete everything and insert updated text value
e.RemoveNodes();
XElement t = new XElement(w + "t", corePropertyValue);
Novacode.Text.PreserveSpace(t);
e.Add(new XElement(firstRun.Name, firstRun.Attributes(), firstRun.Element(XName.Get("rPr", w.NamespaceName)), t));
}
}
using (TextWriter tw = new StreamWriter(new PackagePartStream(pp.GetStream(FileMode.Create, FileAccess.Write))))
header.Save(tw);
}
#endregion
#region Footers
IEnumerable<PackagePart> footerParts = from footerPart in document.package.GetParts()
where (Regex.IsMatch(footerPart.Uri.ToString(), @"/word/footer\d?.xml"))
select footerPart;
foreach (PackagePart pp in footerParts)
{
XDocument footer = XDocument.Load(new StreamReader(pp.GetStream()));
foreach (XElement e in footer.Descendants(XName.Get("fldSimple", w.NamespaceName)))
{
string attr_value = e.Attribute(XName.Get("instr", w.NamespaceName)).Value.Replace(" ", string.Empty).Trim().ToLower();
if (Regex.IsMatch(attr_value, matchPattern))
{
XElement firstRun = e.Element(w + "r");
// Delete everything and insert updated text value
e.RemoveNodes();
XElement t = new XElement(w + "t", corePropertyValue);
Novacode.Text.PreserveSpace(t);
e.Add(new XElement(firstRun.Name, firstRun.Attributes(), firstRun.Element(XName.Get("rPr", w.NamespaceName)), t));
}
}
using (TextWriter tw = new StreamWriter(new PackagePartStream(pp.GetStream(FileMode.Create, FileAccess.Write))))
footer.Save(tw);
}
#endregion
PopulateDocument(document, document.package);
}