我在阅读XML文件并向其添加节点时遇到问题。好吧不完全..添加节点工作正常,但源XML文件包含一些包含"
保存我的xmlDocument后,这些"
部分转换为"
如何阻止c#将"
转换为"
,因为加载xml文件的应用程序需要"
个标记
示例行:
<item name="Description">DBName "xyz"</item>
答案 0 :(得分:0)
您不需要在元素中编码引号,仅在属性中编码。所以:
<item name="Description">DBName "xyz"</item>
是不必要的,你可以使用:
<item name="Description">DBName "xyz"</item>
似乎XmlDocument.Load()理解你在一个元素中不必要地放置编码引号(&amp; quot;)时的意思,默认情况下XmDocument.Save()用未编码的引号(“)替换它们。” / p>
如果您的来源是:
,您会注意到完全相同的行为<item name="Description">DBName "xyz"</item>
其中“是”
的XML字符引用https://stackoverflow.com/a/150441/283787解释说:“不是必须在元素数据中编码的字符。
如果要预设空格,只需添加以下代码行:
doc.PreserveWhitespace = true;
答案 1 :(得分:0)
如果需要在XML文本中保留引用实体,那么XML的使用者肯定是错误的。默认情况下,内置编写器替换不必要的实体;但是,您可以通过实现自定义编写器来覆盖此行为:
public class PreserveQuotesXmlTextWriter : XmlTextWriter
{
private static readonly string[] quoteEntites = { "'", """ };
private static readonly char[] quotes = { '\'', '"' };
private bool isInsideAttribute;
public PreserveQuotesXmlTextWriter(string filename) : base(filename, null)
{
}
public override void WriteStartAttribute(string prefix, string localName, string ns)
{
isInsideAttribute = true;
base.WriteStartAttribute(prefix, localName, ns);
}
private void WriteStringWithReplace(string text)
{
string[] textSegments = text.Split(quotes);
if (textSegments.Length > 1)
{
for (int pos = -1, i = 0; i < textSegments.Length; ++i)
{
base.WriteString(textSegments[i]);
pos += textSegments[i].Length + 1;
if (pos != text.Length)
base.WriteRaw(text[pos] == quotes[0] ? quoteEntites[0] : quoteEntites[1]);
}
}
else base.WriteString(text);
}
public override void WriteString(string text)
{
if (isInsideAttribute)
base.WriteString(text);
else
WriteStringWithReplace(text);
isInsideAttribute = false;
}
}
您甚至可以从XmlDocument
实例使用它:
XmlDocument xml = new XmlDocument();
xml.Load(filename);
// ...
XmlWriter writer = new PreserveQuotesXmlTextWriter(filename);
xml.Save(writer);
答案 2 :(得分:0)
谢谢你们,我真的不需要逃避这些报价。问题是document.save改变了xml输出,因此目标应用程序无法正确读取xml。
示例:
<profile>
<list name="">
<item name="FileVersion">0.88</item>
<item name="ID">xyz</item>
变成
<profile>
<list name="">
<item name="FileVersion">0.88</item>
<item name="ID">xyz</item>
节点前有更多空格
如果有空值
<item name="Value"></item>
变成
<item name="Value">
</item>