使用XElement.Load时如何添加(或忽略)XML命名空间

时间:2009-09-21 09:15:13

标签: c# linq namespaces xelement

我使用Linq to XML和C#创建XML。这一切都很有效,除非我需要在XML中手动添加一行。只有当我有值传递给它时才会添加此行,否则我只是忽略整个标记。

我使用XElement.Load加载我存储在字符串中的文本字符串,但是当我将它附加到XML时,它总是在我标记的末尾放入xmlns =“”。

有没有办法告诉XElement.Load使用现有的命名空间,或者在将字符串放入XML时忽略它?

理想情况下,我只希望将我的字符串包含在正在创建的XML中,而不添加额外的标记。

以下是我目前所做的一个示例:

string XMLDetails = null;
if (ValuePassedThrough != null)
XMLDetails = "<MyNewTag Code=\"14\" Value=\"" + ValuePassedThrough +"\"></MyNewTag>";

当我构建XML时,我将上面的字符串加载到我的XML中。在这里,xmlns =“”被添加到XMLDetails值,但理想情况下我希望忽略它,因为它在尝试读取此标记时导致收件人出现问题。

XNamespace ns = "http://namespace-address";
    XNamespace xsi = "http://XMLSchema-instance-address";

XDocument RequestDoc = new XDocument(
    new XDeclaration("1.0", "utf-8", null),
    new XElement(ns + "HeaderTag",
        new XAttribute("xmlns", ns),
new XAttribute(XNamespace.Xmlns + "xsi", xsi),
new XAttribute(xsi + "schemaLocation", "http://www.addressofschema.xsd"),
        new XAttribute("Version", "1"),
            new XElement(ns + "OpeningTAG",

...我的XML代码......

XElement.Load(new StringReader(XMLDetails))

...... XML代码结束......

如上所述。我的代码有效,它为我成功输出XML。它只是我使用XElement.Load加载的MyNewTag标记将xmlns =“”添加到它的末尾,这导致了我的问题。

我有什么想法可以解决这个问题吗?谢谢你的帮助。

此致 富

2 个答案:

答案 0 :(得分:7)

怎么样:

XElement withoutNamespace = XElement.Load(new StringReader(XMLDetails));
XElement withNamespace = new XElement(ns + withoutNamespace.Name.LocalName,
                                      withoutNamespace.Nodes());

作为更好的替代方案 - 为什么不在构建XML时包含命名空间,或者更好的是,创建XElement而不是手动生成您随后读取的XML字符串。手动创建XML很少是一个好主意。除了其他任何事情,你假设ValuePassedThrough已经被转义,或者不需要转义等等。可能有效 - 但这至少是引起关注的原因。< / p>

答案 1 :(得分:1)

喜欢这个

XElement XMLDetails = new XElement(ns + "OpeningTAG", new XElement(ns + "MyNewTag", new XAttribute("Code", 14), new XAttribute("Value", 123)));

XDocument RequestDoc = new XDocument(
    new XDeclaration("1.0", "utf-8", null),
    new XElement(ns + "HeaderTag",
        new XAttribute("xmlns", ns),
new XAttribute(XNamespace.Xmlns + "xsi", xsi),
new XAttribute(xsi + "schemaLocation", "http://www.addressofschema.xsd"),
        new XAttribute("Version", "1"),
            XMLDetails));