我正在编写一个控制台应用程序,该应用程序生成一个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,这是有效的。
发布于 2015-12-09 18:47:05
如果您使用XDocument.Save(String,SaveOptions)方法在一行上获得全部输出会怎么样?
因此,可以这样做:
xml.Save(fileName, SaveOptions.DisableFormatting);这将迫使声明放在第一行上,这样做的缺点是将整个文档放在第一行,但是如果它适用于该程序,那么也可以这样做。
发布于 2015-12-09 18:53:16
您需要使用允许指定格式选项的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
https://stackoverflow.com/questions/34186487
复制相似问题