C# XElement添加函数添加xmlns="&引用;至死不渝

C# XElement添加函数添加xmlns="&引用;至死不渝,c#,.net,xml,xml-serialization,linq-to-xml,C#,.net,Xml,Xml Serialization,Linq To Xml,我有一个为列表对象生成xml的函数: public XDocument ToXML() { foreach (var row in this) { var xml = row.ToXml(); template.Root.Add(xml); } return template; } template.ToString()的内容为: xml读取:testData add函数执行后,template.ToString()读取:test

我有一个为列表对象生成xml的函数:

public XDocument ToXML()
{
    foreach (var row in this)
    {
        var xml = row.ToXml();
        template.Root.Add(xml);
    }
    return template;
}
template.ToString()的内容为:

xml读取:
testData

add函数执行后,template.ToString()读取:
testData


因此,出于某种原因,添加了一个空名称空间,我如何防止它这样做?

将示例和子元素元素上的名称空间设置为与RootElement相同。它正在添加xmlns=“”,以清除这些元素的命名空间。

可能是您的根需要正确关闭:

 <RootElement xmlns="urn:testTools"> to <RootElement xmlns="urn:testTools"/> 

我通过用正则表达式替换元素解决了这个问题。傻瓜的解决方案不起作用,因为我现在在代码中的那个点上并不总是精确的名称空间

这是我的下流手法:

template = XDocument.Parse(new Regex("<ElementName.*>")
    .Replace(template.ToString(SaveOptions.DisableFormatting), "<ElementName>"));
template=XDocument.Parse(新正则表达式(“”))
.Replace(template.ToString(SaveOptions.DisableFormatting),“”);

下面是一个输出不带空名称空间的xml的示例。请注意奇怪的以Linq为中心的语法rootNamespace+“MyElementName”,这是秘密。这是与整个文档相同的名称空间,因此不需要添加xmlns。这是将一个XNamespace+一个字符串连接起来,这是一个适用于Linq的“+”重载,Linq知道如何处理它。(如果没有Linq,连接字符串和非字符串类型可能是编译错误)。注意,这是针对一个C#项目文件执行的,它是一个方便的Xml文件。将其输出到控制台或richtextbox控件。然后去掉“rootNamespace+”并注意区别

        XDocument doc = null;

        using (StreamReader streamReader =
            new StreamReader(@"myXml.csproj"))
        {
            doc = XDocument.Load(streamReader, LoadOptions.None);
        }
        XNamespace rootNamespace = doc.Root.Name.NamespaceName;

        // A search which finds the ItemGroup which has Reference 
        // elements and returns the ItemGroup XElement.
        XElement element = doc.Descendants().Where(p => p.Name.LocalName == "ItemGroup"
            && p.Descendants().First<XElement>().Name.LocalName == "Reference").First<XElement>();

        // Create a completly new element with sub elements.
        XElement referenceElement = new XElement(rootNamespace + "Reference",
            new XElement(rootNamespace + "SpecificVersion", bool.FalseString),
            new XElement(rootNamespace + "HintPath", "THIS IS A HINT PATH"));

       // Add the new element to the main doc, to the end of the Reference elements.
        element.Add(referenceElement);

        // Add an attribute after the fact for effect.
        referenceElement.SetAttributeValue("Include", "THIS IS AN INCLUDE");

        rtb.Text = doc.ToString(SaveOptions.None);
XDocument doc=null;
使用(StreamReader)StreamReader=
新的StreamReader(@“myXml.csproj”))
{
doc=XDocument.Load(streamReader,LoadOptions.None);
}
XNamespace rootNamespace=doc.Root.Name.NamespaceName;
//查找具有引用的项目组的搜索
//元素并返回ItemGroup元素。
XElement元素=doc.subjects()。其中(p=>p.Name.LocalName==“ItemGroup”
&&p.subjects().First().Name.LocalName==“Reference”).First();
//创建一个包含子元素的全新元素。
XElement referenceElement=新XElement(rootNamespace+“Reference”,
新的XElement(rootNamespace+“SpecificVersion”,bool.false字符串),
新的XElement(rootNamespace+“HintPath”,“这是一个提示路径”);
//将新元素添加到主文档中,添加到引用元素的末尾。
元素。添加(referenceElement);
//在事实之后添加属性以获得效果。
SetAttributeValue(“包含”,“这是一个包含”);
rtb.Text=doc.ToString(SaveOptions.None);

好的,我现在明白为什么会这样了,谢谢!但它只有在合并不同的xml和不同的名称空间时才有用,而不是在创建单个xml文档时。此外,空名称空间标记不是有效的xml。@JJoos:空名称空间当然是有效的xml。你凭什么认为不是?另外,请记住,一个XML文档可能包含来自许多名称空间的元素和属性。@John Saunders您是对的,认为它是非法的,因为:第2.2节第1行。有点困惑。谢谢。小心你的正则表达式。XML不是一种常规语言,所以一般来说,不应该对XML使用正则表达式。谢谢,这看起来是一个非常好的解决方案!下次遇到这个问题我会试试的。谢谢!这很有帮助!谢谢这太棒了+1.