繁体   English   中英

C#-从字符串模板插入XML元素

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM