如何在 C# 中使用 XDocument 在根元素中生成具有多个命名空间的 XML 文件?
How to generate a XML-file with multiple namespaces in root element with XDocument in C#?
我想在 C# 中使用 XDocument 为 Outlook 加载项生成自定义 manifest.xml 文件。
我当前的 XML 文件(我现在要生成的文件)如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<OfficeApp xmlns="http://schemas.microsoft.com/office/appforoffice/1.1"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:bt="http://schemas.microsoft.com/office/officeappbasictypes/1.0"
xmlns:mailappor="http://schemas.microsoft.com/office/mailappversionoverrides"
xsi:type="MailApp">
<Id>{0026EAB0-AFBA-43FE-A3FA-C479B6FEECCA}</Id>
<Version>2.0.0.0</Version>
<!-- More elements -->
</OfficeApp>
我的主要问题是,我无法向 OfficeApp 元素添加多个命名空间。
我已经尝试过以下方法:
private readonly XNamespace Xsi = "xsi:";
private readonly XNamespace MicrosoftSchemasAppsForOffice = "http://schemas.microsoft.com/office/appforoffice/1.1";
private readonly XNamespace W3 = "http://www.w3.org/2001/XMLSchema-instance";
private readonly XNamespace MicrosoftSchemasOfficeBasicTypes = "http://schemas.microsoft.com/office/officeappbasictypes/1.0";
private readonly XNamespace MicrosoftSchemasMailAppVersion = "http://schemas.microsoft.com/office/mailappversionoverrides";
private XDocument GenerateDocument()
{
return new XDocument(
new XDeclaration("1.0", "utf-8", null),
new XElement("OfficeApp",
new XAttribute("xmlns", MicrosoftSchemasAppsForOffice),
new XAttribute(XNamespace.Xmlns + "xsi", W3),
new XAttribute(XNamespace.Xmlns + "bt", MicrosoftSchemasOfficeBasicTypes),
new XAttribute(XNamespace.Xmlns + "mailappor", MicrosoftSchemasMailAppVersion),
new XAttribute(Xsi + "type", "MailApp"),
new XElement("Id", "{" + Guid.NewGuid().ToString() + "}"),
new XElement("Version", "2.0.0.0")
)
);
}
这导致了以下异常:
System.Xml.XmlException: 'The prefix '' cannot be redefined from '' to 'http://schemas.microsoft.com/office/appforoffice/1.1' within the same start element tag.'
我也试过换行
new XAttribute("xmlns", MicrosoftSchemasAppsForOffice),
与
new XAttribute(XNamespace.Xmlns.NamespaceName, MicrosoftSchemasAppsForOffice),
但这给了我以下异常:
System.Xml.XmlException: 'The ':' character, hexadecimal value 0x3A, cannot be included in a name.'
经过数小时的尝试和失败后,我仍然不知道如何正确处理 xmlns 命名空间。
我究竟做错了什么?我认为我尝试生成的 XML-代码是有效的,因为它工作得很好。
感谢任何提示。谢谢!
在 XDocument 中尝试获得正确的命名空间很难,所以我通常只解析一个字符串
string xml =
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
"<OfficeApp xmlns=\"http://schemas.microsoft.com/office/appforoffice/1.1\"" +
" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"" +
" xmlns:bt=\"http://schemas.microsoft.com/office/officeappbasictypes/1.0\"" +
" xmlns:mailappor=\"http://schemas.microsoft.com/office/mailappversionoverrides\"" +
" xsi:type=\"MailApp\">" +
"</OfficeApp>";
XDocument doc = XDocument.Parse(xml);
XElement officeApp = doc.Root;
XNamespace ns = officeApp.GetDefaultNamespace();
officeApp.Add(new XElement(ns + "Id","{0026EAB0-AFBA-43FE-A3FA-C479B6FEECCA}"));
officeApp.Add(new XElement(ns + "Version","2.0.0.0"));
您的根命名空间不必作为属性添加,只需用作元素的命名空间即可。此外,您必须将 xsi 命名空间 value 与类型属性一起使用:
private readonly XNamespace MicrosoftSchemasAppsForOffice = "http://schemas.microsoft.com/office/appforoffice/1.1";
private readonly XNamespace W3 = "http://www.w3.org/2001/XMLSchema-instance";
private readonly XNamespace MicrosoftSchemasOfficeBasicTypes = "http://schemas.microsoft.com/office/officeappbasictypes/1.0";
private readonly XNamespace MicrosoftSchemasMailAppVersion = "http://schemas.microsoft.com/office/mailappversionoverrides";
private XDocument GenerateDocument()
{
return new XDocument(
new XDeclaration("1.0", "utf-8", null),
new XElement(MicrosoftSchemasAppsForOffice + "OfficeApp",
new XAttribute(XNamespace.Xmlns + "xsi", W3),
new XAttribute(XNamespace.Xmlns + "bt", MicrosoftSchemasOfficeBasicTypes),
new XAttribute(XNamespace.Xmlns + "mailappor", MicrosoftSchemasMailAppVersion),
new XAttribute(W3 + "type", "MailApp"),
new XElement(MicrosoftSchemasAppsForOffice + "Id", "{" + Guid.NewGuid().ToString() + "}"),
new XElement(MicrosoftSchemasAppsForOffice + "Version", "2.0.0.0")
)
);
}
我想在 C# 中使用 XDocument 为 Outlook 加载项生成自定义 manifest.xml 文件。
我当前的 XML 文件(我现在要生成的文件)如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<OfficeApp xmlns="http://schemas.microsoft.com/office/appforoffice/1.1"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:bt="http://schemas.microsoft.com/office/officeappbasictypes/1.0"
xmlns:mailappor="http://schemas.microsoft.com/office/mailappversionoverrides"
xsi:type="MailApp">
<Id>{0026EAB0-AFBA-43FE-A3FA-C479B6FEECCA}</Id>
<Version>2.0.0.0</Version>
<!-- More elements -->
</OfficeApp>
我的主要问题是,我无法向 OfficeApp 元素添加多个命名空间。
我已经尝试过以下方法:
private readonly XNamespace Xsi = "xsi:";
private readonly XNamespace MicrosoftSchemasAppsForOffice = "http://schemas.microsoft.com/office/appforoffice/1.1";
private readonly XNamespace W3 = "http://www.w3.org/2001/XMLSchema-instance";
private readonly XNamespace MicrosoftSchemasOfficeBasicTypes = "http://schemas.microsoft.com/office/officeappbasictypes/1.0";
private readonly XNamespace MicrosoftSchemasMailAppVersion = "http://schemas.microsoft.com/office/mailappversionoverrides";
private XDocument GenerateDocument()
{
return new XDocument(
new XDeclaration("1.0", "utf-8", null),
new XElement("OfficeApp",
new XAttribute("xmlns", MicrosoftSchemasAppsForOffice),
new XAttribute(XNamespace.Xmlns + "xsi", W3),
new XAttribute(XNamespace.Xmlns + "bt", MicrosoftSchemasOfficeBasicTypes),
new XAttribute(XNamespace.Xmlns + "mailappor", MicrosoftSchemasMailAppVersion),
new XAttribute(Xsi + "type", "MailApp"),
new XElement("Id", "{" + Guid.NewGuid().ToString() + "}"),
new XElement("Version", "2.0.0.0")
)
);
}
这导致了以下异常:
System.Xml.XmlException: 'The prefix '' cannot be redefined from '' to 'http://schemas.microsoft.com/office/appforoffice/1.1' within the same start element tag.'
我也试过换行
new XAttribute("xmlns", MicrosoftSchemasAppsForOffice),
与
new XAttribute(XNamespace.Xmlns.NamespaceName, MicrosoftSchemasAppsForOffice),
但这给了我以下异常:
System.Xml.XmlException: 'The ':' character, hexadecimal value 0x3A, cannot be included in a name.'
经过数小时的尝试和失败后,我仍然不知道如何正确处理 xmlns 命名空间。 我究竟做错了什么?我认为我尝试生成的 XML-代码是有效的,因为它工作得很好。
感谢任何提示。谢谢!
在 XDocument 中尝试获得正确的命名空间很难,所以我通常只解析一个字符串
string xml =
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
"<OfficeApp xmlns=\"http://schemas.microsoft.com/office/appforoffice/1.1\"" +
" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"" +
" xmlns:bt=\"http://schemas.microsoft.com/office/officeappbasictypes/1.0\"" +
" xmlns:mailappor=\"http://schemas.microsoft.com/office/mailappversionoverrides\"" +
" xsi:type=\"MailApp\">" +
"</OfficeApp>";
XDocument doc = XDocument.Parse(xml);
XElement officeApp = doc.Root;
XNamespace ns = officeApp.GetDefaultNamespace();
officeApp.Add(new XElement(ns + "Id","{0026EAB0-AFBA-43FE-A3FA-C479B6FEECCA}"));
officeApp.Add(new XElement(ns + "Version","2.0.0.0"));
您的根命名空间不必作为属性添加,只需用作元素的命名空间即可。此外,您必须将 xsi 命名空间 value 与类型属性一起使用:
private readonly XNamespace MicrosoftSchemasAppsForOffice = "http://schemas.microsoft.com/office/appforoffice/1.1";
private readonly XNamespace W3 = "http://www.w3.org/2001/XMLSchema-instance";
private readonly XNamespace MicrosoftSchemasOfficeBasicTypes = "http://schemas.microsoft.com/office/officeappbasictypes/1.0";
private readonly XNamespace MicrosoftSchemasMailAppVersion = "http://schemas.microsoft.com/office/mailappversionoverrides";
private XDocument GenerateDocument()
{
return new XDocument(
new XDeclaration("1.0", "utf-8", null),
new XElement(MicrosoftSchemasAppsForOffice + "OfficeApp",
new XAttribute(XNamespace.Xmlns + "xsi", W3),
new XAttribute(XNamespace.Xmlns + "bt", MicrosoftSchemasOfficeBasicTypes),
new XAttribute(XNamespace.Xmlns + "mailappor", MicrosoftSchemasMailAppVersion),
new XAttribute(W3 + "type", "MailApp"),
new XElement(MicrosoftSchemasAppsForOffice + "Id", "{" + Guid.NewGuid().ToString() + "}"),
new XElement(MicrosoftSchemasAppsForOffice + "Version", "2.0.0.0")
)
);
}