如何使用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,这很有效。
如果您使用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