我有一个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
并从文件加载新方面(这基本上是我用数据填充的模板(。然后,我用新方面填充文档片段,并从小就附加它。
但是,当我尝试设置此片段的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>
请注意,我不想为此创建Pocos并将其序列化,因为这些方面实际上很大且嵌套了,并且我在其他一些XML文件中也遇到了同样的问题。
编辑:
JDWENG建议使用XMLLINQ(这比我以前使用的要好,所以谢谢(。这是我尝试与XMLLINQ一起使用的代码(由于未申报的前缀而仍失败(:
var aspects = XDocument.Load("aspects.xml");
var newAspects = EXlement.Parse(_templateIFilledWithData); // Fails here - Undeclared prefix 'i'
aspects.Root.add(newAspect);
使用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$")
}));
}
}
}