我有一个现有的xml文档:
<?xml version="1.0" encoding="utf-16"?>
<property_set_list>
<property_set symbol_id="TestPropertySet1">
<property symbol_id="TestName1" id="1" type="8">Test</property>
<property symbol_id="TestName2" id="2" type="8"></property>
</property_set>
<property_set symbol_id="TestPropertySet2">
</property_set>
</property_set_list>
我加载它并更新并添加一些属性。例如:
TestName1属性已更新。TestName 2属性保持不变。
在TestPropertySet2中,我添加了一些新属性。
经过所有操作后,文档的输出如下:
<?xml version="1.0" encoding="utf-16"?>
<property_set_list>
<property_set symbol_id="TestPropertySet1">
<property symbol_id="TestName1" id="1" type="8">qwerty</property>
<property symbol_id="TestName2" id="1" type="8">
</property>
</property_set>
<property_set symbol_id="TestPropertySet2">
<property symbol_id="localeID" id="1" type="19">1033</property>
<property symbol_id="localeID" id="2" type="19">1079</property>
</property_set>
</property_set_list>
这是我用于加载和处理文档的代码:
using (var reader = ReaderCreator())
using (var output = OutputCreator())
using (var xmlWriter = new XmlTextWriter(output))
{
xmlWriter.Indentation = 1;
xmlWriter.Formatting = Formatting.Indented;
xmlWriter.IndentChar = TAB;
XDoc = XElement.Load(reader, LoadOptions.None);
Namespace = "some namespace";
// some code to update properties
// adds new nodes to TestPropertySet2
foreach (var localeId in _franchise.LocaleIds)
{
TestPropertySet2.Add(
new XElement(
Namespace + "property", localeId,
new XAttribute("symbol_id", "localeID"),
new XAttribute("id", i),
new XAttribute("type", "19")
)
);
i++;
}
XDoc.Save(xmlWriter);
}
问题是TestName2属性现在位于两行中:
<property symbol_id="TestName2" id="1" type="8">
</property>
我不知道您ReaderCreator()
和OutputCreator()
方法的用途。但是下面的代码可以按我的要求工作。
string xml = "<property_set_list><property_set symbol_id=\"TestPropertySet1\"><property symbol_id=\"TestName1\" id=\"1\" type=\"8\">qwerty</property>" +
"<property symbol_id=\"TestName2\" id=\"1\" type=\"8\"></property></property_set><property_set symbol_id=\"TestPropertySet2\">" +
"<property symbol_id=\"localeID\" id=\"1\" type=\"19\">1033</property><property symbol_id=\"localeID\" id=\"2\" type=\"19\">1079</property></property_set></property_set_list>";
XElement xdoc = XElement.Parse(xml);
XElement TestPropertySet2 = xdoc.Elements()
.Where(x => x.Attribute("symbol_id").Value == "TestPropertySet2")
.FirstOrDefault();
TestPropertySet2.Add(
new XElement(
"property", "locale_id_val",
new XAttribute("symbol_id", "localeID"),
new XAttribute("id", "99"),
new XAttribute("type", "19")
));
XmlWriterSettings xws = new XmlWriterSettings();
xws.Indent = true;
xws.IndentChars = "\t\t";
FileStream fs = new FileStream("test.xml", FileMode.Create);
using (XmlWriter xw = XmlWriter.Create(fs, xws))
{
xdoc.Save(xw);
}
fs.Close();
这将产生以下输出(保留缩进):
<property_set_list>
<property_set symbol_id="TestPropertySet1">
<property symbol_id="TestName1" id="1" type="8">qwerty</property>
<property symbol_id="TestName2" id="1" type="8"></property>
</property_set>
<property_set symbol_id="TestPropertySet2">
<property symbol_id="localeID" id="1" type="19">1033</property>
<property symbol_id="localeID" id="2" type="19">1079</property>
<property symbol_id="localeID" id="99" type="19">locale_id_val</property>
</property_set>
请不要使用XmlWriter
代替XmlTextWriter
。我不知道这是否是您遇到问题的原因。此代码可以轻松地适应您的特定实现。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句