XmlDocumentFragment设置InnerXml失败,未声明前缀

时间:2017-06-06 13:33:31

标签: c# xml

我有一个基本上如下的XML文档:

<ArrayOfAspect xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
    <Aspect i:type="TransactionAspect">
        ...
    </Aspect>
    <Aspect i:type="TransactionAspect">
        ...
    </Aspect>
</ArrayOfAspect>

我想在此列表中附加一个新的Aspect
 为了做到这一点,我从文件中加载这个xml,创建一个XmlDocumentFragment并从一个文件加载新的Aspect(这基本上是我填充数据的模板)。然后我用新方面填充文档片段并将其作为子项附加。
但是当我尝试设置此片段的xml时,它会失败,因为前缀i未定义。

// Load all aspects
var aspectsXml = new XmlDocument();
aspectsXml.Load("aspects.xml");

// Create and fill the fragment
var fragment = aspectsXml.CreateDocumentFragment();
fragment.InnerXml = _templateIFilledWithData; // This fails because i is not defined

// Add the new child
aspectsXml.AppendChild(fragment)

这就是模板的样子:

<Aspect i:type="TransactionAspect">
    <Value>$VALUES_PLACEHOLDER$</Value>
    ...
</Aspect>

请注意,我不想为此创建POCO并将它们序列化,因为这些方面实际上非常大且嵌套,并且我对其他一些xml文件也有同样的问题。

编辑:
jdweng建议使用XmlLinq(这比我之前使用的方式更好,所以谢谢)。这是我尝试与XmlLinq一起使用的代码(由于未声明的前缀仍然失败):

var aspects = XDocument.Load("aspects.xml");
var newAspects = EXlement.Parse(_templateIFilledWithData); // Fails here - Undeclared prefix 'i'
aspects.Root.add(newAspect);

1 个答案:

答案 0 :(得分:0)

使用xml linq:

using System.Collections.ObjectModel;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;



namespace ConsoleApplication57
{
    class Program
    {
        const string URL = "http://goalserve.com/samples/soccer_inplay.xml";
        static void Main(string[] args)
        {
            string xml =
                "<ArrayOfAspect xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\">" +
                    "<Aspect i:type=\"TransactionAspect\">" +
                   "</Aspect>" +
                    "<Aspect i:type=\"TransactionAspect\">" +
                    "</Aspect>" +
                "</ArrayOfAspect>";

            XDocument doc = XDocument.Parse(xml);

            XElement root = doc.Root;
            XNamespace nsI = root.GetNamespaceOfPrefix("i");

            root.Add(new XElement("Aspect", new object[] {
                new XAttribute(nsI + "type", "TransactionAspect"),
                new XElement("Value", "$VALUES_PLACEHOLDER$")
            }));


        }

    }

}