我有一个基本上如下的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);
答案 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$")
}));
}
}
}