如何使用System.XML.Linq将XML处理指令放置在第1行

本文关键字:XML 指令 1行 处理 何使用 System Linq | 更新日期: 2023-09-27 18:26:14

我正在编写一个控制台应用程序,该应用程序生成一个XML文件,该文件将由很久以前编写的服务器作业处理应用程序使用。服务器应用程序需要一个处理指令:<?JtJob jobname?>。我正在使用C#XDocument生成我的xml:

XDocument xml = new XDocument(new XProcessingInstruction("JtJob", "FieldInspection3_Rejected"),
    new XElement("Document",
        new XElement("DataFile", tempFileName),
        new XElement("FormType","Corrected Form Package"),
        new XElement("BYOD_RejectComment",reasonForRejection),
        new XElement("BYOD_FromTech",techEmail)
    )
);
xml.Save(Path.Combine("C:''Data", DateTime.Now.ToString("yyyyMMdd_HHmmssffff") + "_Rejected.xml"));

出于某种原因,服务器应用程序要求处理指令位于第一行。如果我的xml文件看起来像这样:

<?xml version="1.0" encoding="utf-8"?><?JtJob FieldInspection3_Rejected?>
<Document>
  <DataFile>C:'Windows'TEMP'tmp387F.tmp</DataFile>
  <FormType>Corrected Form Package</FormType>
  <BYOD_RejectComment>you're ugly</BYOD_RejectComment>
  <BYOD_FromTech>example@gmail.com</BYOD_FromTech>
</Document>

一切都很好。但当它看起来像这样时:

<?xml version="1.0" encoding="utf-8"?>
<?JtJob FieldInspection3_Rejected?>
<Document>
  <DataFile>C:'Windows'TEMP'tmp387F.tmp</DataFile>
  <FormType>Corrected Form Package</FormType>
  <BYOD_RejectComment>you're ugly</BYOD_RejectComment>
  <BYOD_FromTech>example@gmail.com</BYOD_FromTech>
</Document>

它出错了。我的问题是,使用上面的XDocument代码,它会生成第二个输出。

在不将我生成的xml作为字符串加载并操作字符串的情况下,有没有一种方法可以让XDocument在第一行创建处理指令?

我知道服务器应用程序肯定会因为不接受有效的XML语法而受到指责,但我的目标是让它发挥作用,而不是修复一个20年前的程序。

编辑:谢谢!使用保存覆盖保留了格式。没有把它全部做成一行,但它让我可以把PI保持在第1行。

编辑2:嗯,这对我也没有帮助。但我发现了什么对我有帮助!XDocument.Save()默认情况下输出带BOM的UTF8。我使用XMLTextWriter将其更改为不带BOM,这很有效。

如何使用System.XML.Linq将XML处理指令放置在第1行

如果您使用XDocument.Save(String,SaveOptions)方法在一行上获得全部输出,会怎么样?

所以改为这样做:

xml.Save(fileName, SaveOptions.DisableFormatting);

这将迫使声明放在第一行,不利的是将整个文档放在第一列,但如果它适用于该程序,那么就这样吧。

您需要使用XDocument.Save()重载,该重载允许您指定格式选项:

xml.Save(Path.Combine("C:''Data", DateTime.Now.ToString("yyyyMMdd_HHmmssffff") + "_Rejected.xml"),
         SaveOptions.DisableFormatting);

https://msdn.microsoft.com/en-us/library/bb551426(v=vs.110).aspx