编辑并保存添加额外[]字符的XML



我有一个编辑和保存的要求——用参数中的值精确地替换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;
}

当您使用带DTD的XmlDocument解析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中不显示任何内容。

一个空的内部子集做什么

内部实体的基本目的是避免一次又一次地键入相同的内容(如组织名称)。相反,我们可以定义一个内部实体来包含文本,然后只需要在要插入文本的地方使用该实体。因为实体是由解析器扩展的,所以可以保证在每个位置都会得到相同的文本。如果您拼错了实体名称,解析器也会捕获。

你可以在这里阅读更多关于内部子集的

最新更新