[英]Edit CustomXML with OpenXML C#
这是我的第一个 OpenXML 项目。 我正在尝试编辑 docx 文件的 CustomXML 文件。 我正在尝试改变这一点:
<?xml version="1.0" encoding="UTF-8"?>
<PERSON>
<NAMETAG>NAME</NAMETAG>
<DOBTAG>DOB</DOBTAG>
<SCORE1TAG>SCORE1</SCORE1TAG>
<SCORE2TAG>SCORE2</SCORE2TAG>
</PERSON>
对此:
<?xml version="1.0" encoding="UTF-8"?>
<PERSON>
<NAMETAG>John Doe</NAMETAG>
<DOBTAG>01/01/2020</DOBTAG>
<SCORE1TAG>90.5</SCORE1TAG>
<SCORE2TAG>100.0</SCORE2TAG>
</PERSON>
我宁愿不使用搜索和替换,而是导航 WordprocessingDocument 以找到要修改的正确属性。 我试图做一个完整的删除/添加,但破坏了文件并且没有工作。 这是该代码:
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
byte[] byteArray = File.ReadAllBytes(@"C:\Simple_Template.docx");
using (MemoryStream stream = new MemoryStream())
{
stream.Write(byteArray, 0, (int)byteArray.Length);
WordprocessingDocument doc = WordprocessingDocument.Open(stream, true);
doc.MainDocumentPart.DeleteParts<CustomXmlPart>(doc.MainDocumentPart.CustomXmlParts);
string newcustomXML = @"<?xml version=""1.0\"" encoding=""UTF-8\""?><Person><NAMETAG>John Doe</NAMETAG><DOBTAG>DOB</DOBTAG><SCORE1TAG>90.5</SCORE1TAG><SCORE2TAG>100.0</SCORE2TAG></PERSON>";
CustomXmlPart xmlPart = doc.MainDocumentPart.AddCustomXmlPart(CustomXmlPartType.CustomXml);
byte[] byteArrayXML = Encoding.UTF8.GetBytes(newcustomXML);
using (MemoryStream xml_strm = new MemoryStream(byteArrayXML))
{
xmlPart.FeedData(xml_strm);
}
doc.MainDocumentPart.Document.Save();
doc.Close();
File.WriteAllBytes(@"C:\Simple_Template_Replace.docx", stream.ToArray());
}
}
我也尝试浏览该结构,但我很难弄清楚 WordprocessingDocument object 中的哪个位置包含我需要修改的实际值。 理想情况下,我想要这样的伪代码:
doc.MainDocumentPart.CustomXMLPart.Select("NAMETAG") = "John Doe"
--------关注---------
下面的答案在没有命名空间的情况下运行良好。 现在我想添加一个。 这是新的 XML:
<?xml version="1.0"?><myxml xmlns="www.mydomain.com">
<PERSON>
<NAMETAG>NAME</NAMETAG>
<DOBTAG>DOB</DOBTAG>
<SCORE1TAG>SCORE1</SCORE1TAG>
<SCORE2TAG>SCORE2</SCORE2TAG>
</PERSON>
</myxml>
我已将代码调整为以下,但 SelectSingleNode 调用返回 NULL。 这是更新的代码:
XmlNamespaceManager mgr = new XmlNamespaceManager(xmlDocument.NameTable);
mgr.AddNamespace("ns", "www.mydomain.com");
string name_tag = xmlDocument.SelectSingleNode("/ns:myxml/ns:PERSON/ns:NAMETAG", mgr).InnerText;
我能够自己解决这个问题。 我没有意识到您需要在每个元素中包含“ns:”。 我仍然认为我可以将 String.Empty 传递到我的 AddNamespace 中,然后我就不必这样做了。 但这暂时可行。
问题在于newcustomXML
值,它在 XML 声明中有两个 '\' 字符,并且“PERSON”元素的开始标记具有大写而不是大写。
因此,请尝试使用以下内容:
string newcustomXML = @"<?xml version=""1.0"" encoding=""UTF-8""?>
<PERSON>
<NAMETAG>John Doe</NAMETAG>
<DOBTAG>01/01/2020</DOBTAG>
<SCORE1TAG>90.5</SCORE1TAG>
<SCORE2TAG>100.0</SCORE2TAG>
</PERSON>";
另外关于您的导航尝试,请尝试使用:
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
byte[] byteArray = File.ReadAllBytes(@"C:\Simple_Template.docx");
using (MemoryStream stream = new MemoryStream())
{
stream.Write(byteArray, 0, (int)byteArray.Length);
WordprocessingDocument doc = WordprocessingDocument.Open(stream, true);
CustomXmlPart xmlPart = doc.MainDocumentPart.CustomXmlParts.First();
XmlDocument xmlDocument = new XmlDocument();
using (var inputStream = xmlPart.GetStream(FileMode.Open, FileAccess.Read))
using (var outputStream = new MemoryStream())
{
xmlDocument.Load(inputStream);
xmlDocument.SelectSingleNode("/PERSON/NAMETAG").InnerText = "John Doe";
xmlDocument.Save(outputStream);
outputStream.Seek(0, SeekOrigin.Begin);
xmlPart.FeedData(outputStream);
}
doc.MainDocumentPart.Document.Save();
doc.Close();
File.WriteAllBytes(@"C:\Simple_Template_Replace.docx", stream.ToArray());
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.