[英]C# - Insert XML Element from String template
我有给定结构的xml:
<ArrayOfElement>
<Element>
<ID>1</ID>
<Value>Value1</Value>
</Element>
<Element>
<ID>2</ID>
<Value>Value2</Value>
</Element>
<Element>
<ID>3</ID>
<Value>Value3</Value>
</Element>
...
</ArrayOfElement>
我想用此模板插入另一个Element(但仅当不存在具有给定ID的元素时):
<Element>
<ID>$ID$</ID>
<Value>$VALUE$</Value>
</Element>
所以我的想法是将模板加载为string
并用给定的$VALUE$
替换$ID$
和$VALUE$
。 然后,我将此字符串解析为XmlDocumentFragment
。 然后,我需要查看具有此ID的元素是否已经存在,并且仅当该元素不存在时,我才想插入新元素。
但是我不知道如何找到是否存在。
我当前的方法是:
// Load the XML with the ArrayOfElement
var allElements = new XmlDocument();
allElements.Load("file.xml");
// Load the template and insert id and value
var xmlTemplate = File.ReadAllText("template.xml");
var fragment = allElements.CreateDocumentFragment();
fragment.InnerXml = xmlTemplate.Replace("$ID$", _id).Replace("$VALUE$", _value);
// This does not work since it will throw an exception if none is found:
if (allElements.SelectNodes("ArrayOfElement/Element/ID/text() = '" + _id + "'").Count == 0)
{
allElements.appendChild(fragment);
}
另外,我真的想使用模板文件,因为我实际上有更复杂的场景,其中在C#中添加这些XML标签而不使用模板字符串将是很多工作的方式。
您可以借助XMLSerialization和Deserialization来实现这一目标,
public class SerializeDeserialize
{
[XmlRoot(ElementName = "ArraofElements")]
public class ArraofElements
{
private List<Element> elm = new List<Element>();
[XmlElement("Module")]
public List<Element> Elm
{
get { return elm; }
set { elm = value; }
}
}
public class Element
{
[XmlElement("ID")]
public int id { get; set; }
[XmlElement("Value")]
public string value { get; set; }
}
ArraofElements dnl = new ArraofElements();
public void Serialize(object sender, EventArgs e)
{
for (int i = 0; i < 10; i++)
{
var temp = dnl.Elm.FirstOrDefault(x => x.id == i);
if (temp == null)
temp = new Element();
temp.id = i;
temp.value = "Element " + i;
dnl.Elm.Add(temp);
}
try
{
// to Save columnorders to the file
var serializer = new XmlSerializer(typeof(ArraofElements));
var ns = new XmlSerializerNamespaces();
ns.Add("", "");
using (TextWriter writer = new StreamWriter(@"your path"))
{
serializer.Serialize(writer, dnl, ns);
}
}
catch { }
}
public void Deserialize(object sender, EventArgs e)
{
try
{
if (File.Exists(@"your path"))
{
var deserializer = new XmlSerializer(typeof(ArraofElements));
using (TextReader reader = new StreamReader(@"your path"))
{
dnl = (ArraofElements)deserializer.Deserialize(reader);
}
}
}
catch
{
}
}
}
这将按预期工作,请尝试
XPath中的条件必须放在方括号内,因此将xpath重写为:
if (allElements.SelectNodes("ArrayOfElement/Element/ID[text()='" + _id + "']").Count == 0)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.