我需要编辑和保存-用自变量的值精确地替换xml(在c#项目中)中的文本,并保存在临时位置。该值被替换并保存在位置中,但是它添加了一些字符-[],因此当我在另一个应用程序中使用xml作为输入时,它显示为错误的xml!即使当我删除多余的字符并保存并重新运行时,它也会显示相同的错误。但是,当我删除多余的字符并将整个xml粘贴到一个新文件中时,它工作正常!我不明白是什么问题。在下面粘贴了我的代码:
{
parameterFileName = "test";
tempPath = Path.GetTempPath() + parameterFileName + DateTime.Now.ToString("dd-MM-yyyy_hh-mm-ss") + ".xml";
XmlDocument xdoc = GetParameterXML(parameterFileName);
XmlNode root = xdoc.DocumentElement;
XmlNode node = xdoc.DocumentElement.SelectSingleNode(@"/root/inputParameters");
XmlNode childNode = node.ChildNodes[0];
if (childNode is XmlCDataSection)
{
XmlCDataSection cdataSection = childNode as XmlCDataSection;
if (cdataSection.Value.Contains("ID_VALUE"))
{
cdataSection.Value = cdataSection.Value.Replace("ID_VALUE", id);
}
}
xdoc.Save(tempPath);
}
public static XmlDocument GetParameterXML(string parameterFileName)
{
var sDllPath = AppDomain.CurrentDomain.BaseDirectory;
XmlDocument xDoc = new XmlDocument();
xDoc.Load(sDllPath + "\\Templates\\" + parameterFileName + ".xml");
return xDoc;
}
答案 0 :(得分:0)
当您将XmlDocument
与DTD一起使用来解析Xml文档时,内部子集为空表示自动插入方括号[]。
public static XmlDocument GetParameterXML(string parameterFileName)
{
var sDllPath = AppDomain.CurrentDomain.BaseDirectory;
XmlDocument xDoc = new XmlDocument();
xDoc.Load(sDllPath + "\\Templates\\" + parameterFileName + ".xml");
if (xDoc.DocumentType != null)
{
var name = xDoc.DocumentType.Name;
var publicId = xDoc.DocumentType.PublicId;
var systemId = xDoc.DocumentType.SystemId;
var parent = xDoc.DocumentType.ParentNode;
var documentTypeWithNullInternalSubset = xDoc.CreateDocumentType(name, publicId, systemId, null);
parent.ReplaceChild(documentTypeWithNullInternalSubset, xDoc.DocumentType);
}
return xDoc;
}
有关系吗?
没有关系。但如果您的XML不包含任何内部子集,则格式良好的XML表示为空白方括号[]。这意味着您的xml不包含任何内部子集。
使用不带内部子集的XDocument解析xml时,XDocument会附加空白方括号[],而不是在DOCTYPE中不显示任何内容。
一个空的内部子集做什么?
内部实体的基本目的是避免一次又一次键入相同的内容(如组织的名称)。相反,我们可以定义一个内部实体来包含文本,然后只需要在要插入文本的位置使用该实体。由于该实体是由解析器扩展的,因此可以确保在每个位置都会得到相同的文本。如果您拼错实体名称,解析器也会捕获。
您可以了解有关内部子集here
的更多信息