簡體   English   中英

使用 OpenXML C# 編輯 CustomXML

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM