From 318bc52c24308095662694aaea0feb2e4d640b32 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jostein=20Kj=C3=B8nigsen?= <jostein@kjonigsen.net>
Date: Thu, 15 Feb 2024 21:54:14 +0100
Subject: [PATCH] nxml-mode: Add schemas for .net related development
 file-formats

- MSBuild project files
- Dotnet build properties files
- Dotnet package properties files
- Dotnet resource extension files
- Dotnet Application config files
- Nuget config file
- Nuget package specification file
- Nuget packages config file
---
 etc/schema/dotnet-appconfig.rnc       | 399 ++++++++++++
 etc/schema/dotnet-build-props.rnc     |  93 +++
 etc/schema/dotnet-packages-config.rnc |  10 +
 etc/schema/dotnet-packages-props.rnc  |  21 +
 etc/schema/dotnet-resx.rnc            |  57 ++
 etc/schema/msbuild.rnc                | 905 ++++++++++++++++++++++++++
 etc/schema/nuget.rnc                  |  25 +
 etc/schema/nuspec.rnc                 | 100 +++
 etc/schema/schemas.xml                |  29 +
 9 files changed, 1639 insertions(+)
 create mode 100644 etc/schema/dotnet-appconfig.rnc
 create mode 100644 etc/schema/dotnet-build-props.rnc
 create mode 100644 etc/schema/dotnet-packages-config.rnc
 create mode 100644 etc/schema/dotnet-packages-props.rnc
 create mode 100644 etc/schema/dotnet-resx.rnc
 create mode 100644 etc/schema/msbuild.rnc
 create mode 100644 etc/schema/nuget.rnc
 create mode 100644 etc/schema/nuspec.rnc

diff --git a/etc/schema/dotnet-appconfig.rnc b/etc/schema/dotnet-appconfig.rnc
new file mode 100644
index 00000000000..81833df1827
--- /dev/null
+++ b/etc/schema/dotnet-appconfig.rnc
@@ -0,0 +1,399 @@
+default namespace = ""
+namespace ns1 = "http://schemas.microsoft.com/.NetConfiguration/v2.0"
+namespace ns2 = "urn:schemas-microsoft-com:asm.v1"
+
+start =
+  element configuration {
+    element configSections { (section | sectionGroup)+ }?,
+    element system.web.webPages.razor {
+      element host {
+        attribute factoryType { text }
+      },
+      pages
+    }?,
+    (system.web
+     | system.webServer
+     | element appSettings { (text | add)+ }
+     | element connectionStrings { add* }
+     | element entityFramework {
+         element defaultConnectionFactory {
+           attribute type { text },
+           element parameters {
+             element parameter {
+               attribute value { xsd:NCName }
+             }
+           }
+         },
+         element providers {
+           element provider {
+             attribute invariantName { xsd:NCName },
+             attribute type { text }
+           }
+         }
+       }
+     | element location {
+         attribute inheritInChildApplications { xsd:boolean }?,
+         attribute path { text },
+         system.web?,
+         system.webServer?
+       }
+     | element runtime {
+         element ns2:assemblyBinding {
+           attribute appliesTo { xsd:NCName }?,
+           element ns2:dependentAssembly {
+             element ns2:Paket { xsd:NCName }?,
+             element ns2:assemblyIdentity {
+               attribute culture { xsd:NCName }?,
+               attribute name { xsd:NCName },
+               attribute publicKeyToken { xsd:NMTOKEN }
+             },
+             element ns2:bindingRedirect {
+               attribute newVersion { xsd:NMTOKEN },
+               attribute oldVersion { xsd:NMTOKEN }
+             }
+           }+
+         }+
+       }
+     | element system.codedom {
+         element compilers {
+           element compiler {
+             attribute compilerOptions { text }?,
+             attribute extension { xsd:NMTOKEN },
+             attribute language { text },
+             attribute type { text },
+             attribute warningLevel { xsd:integer },
+             element providerOption {
+               attribute name { xsd:NCName },
+               attribute value { xsd:NCName }
+             }*
+           }+
+         }
+       }
+     | element system.diagnostics {
+         element sources {
+           element source {
+             attribute name { xsd:NCName },
+             element listeners { add }?
+           }+
+         },
+         (element switches { empty },
+          element sharedListeners { empty },
+          element trace {
+            attribute autoflush { xsd:boolean }
+          })?
+       }
+     | element system.serviceModel {
+         (element behaviors {
+            element serviceBehaviors {
+              element behavior {
+                attribute name { text }?,
+                element serviceMetadata {
+                  attribute httpGetEnabled { xsd:boolean },
+                  attribute httpsGetEnabled { xsd:boolean }?
+                },
+                element serviceDebug {
+                  attribute httpHelpPageEnabled { xsd:boolean }?,
+                  attribute includeExceptionDetailInFaults {
+                    xsd:boolean
+                  }
+                },
+                element dataContractSerializer {
+                  attribute maxItemsInObjectGraph { xsd:integer }
+                }?,
+                element serviceTelemetry { empty }?
+              }
+            }
+          }
+          | element bindings {
+              element basicHttpBinding {
+                element binding {
+                  attribute closeTimeout { xsd:time }?,
+                  attribute maxBufferSize { xsd:integer }?,
+                  attribute maxReceivedMessageSize { xsd:integer }?,
+                  attribute name { xsd:NCName }?,
+                  attribute openTimeout { xsd:time }?,
+                  attribute receiveTimeout { xsd:time }?,
+                  attribute sendTimeout { xsd:time }?,
+                  element readerQuotas {
+                    attribute maxArrayLength { xsd:integer },
+                    attribute maxBytesPerRead { xsd:integer }?,
+                    attribute maxDepth { xsd:integer }?,
+                    attribute maxNameTableCharCount { xsd:integer }?,
+                    attribute maxStringContentLength { xsd:integer }
+                  }?,
+                  security?
+                }+
+              }?
+            }
+          | element client { empty }
+          | element extensions {
+              element behaviorExtensions { add+ }
+            }
+          | element protocolMapping { add+ }
+          | element serviceHostingEnvironment {
+              attribute aspNetCompatibilityEnabled { xsd:boolean }?,
+              attribute multipleSiteBindingsEnabled { xsd:boolean }?
+            })*,
+         (element diagnostics {
+            element messageLogging {
+              attribute logEntireMessage { xsd:boolean },
+              attribute logMalformedMessages { xsd:boolean },
+              attribute logMessagesAtServiceLevel { xsd:boolean },
+              attribute logMessagesAtTransportLevel { xsd:boolean },
+              attribute maxMessagesToLog { xsd:integer },
+              attribute maxSizeOfMessageToLog { xsd:integer }
+            }
+          }
+          | element services {
+              element service {
+                attribute behaviorConfiguration { xsd:NCName }?,
+                attribute name { text },
+                element endpoint {
+                  attribute address { xsd:NCName }?,
+                  attribute binding { xsd:NCName },
+                  attribute bindingConfiguration { xsd:NCName }?,
+                  attribute contract { xsd:NCName }
+                }+
+              }+
+            })?
+       })+
+  }
+  | element ns1:configuration {
+      element ns1:configSections {
+        element ns1:section {
+          attribute name { xsd:NCName },
+          attribute requirePermission { xsd:boolean },
+          attribute type { text }
+        }
+      },
+      element ns1:appSettings { empty },
+      element ns1:connectionStrings { empty },
+      element ns1:system.web {
+        element ns1:compilation {
+          attribute debug { xsd:boolean },
+          attribute defaultLanguage { text },
+          attribute targetFramework { xsd:decimal }
+        },
+        element ns1:authentication {
+          attribute mode { xsd:NCName }
+        },
+        element ns1:httpModules { ns1.add },
+        element ns1:pages {
+          attribute clientIDMode { xsd:NCName },
+          attribute controlRenderingCompatibilityVersion { xsd:decimal }
+        }
+      },
+      element ns1:system.webServer {
+        element ns1:modules {
+          attribute runAllManagedModulesForAllRequests { xsd:boolean },
+          ns1.add
+        }
+      },
+      element ns1:rewriter {
+        element ns1:rewrite {
+          attribute to { text },
+          attribute url { text }
+        }+
+      }
+    }
+section =
+  element section {
+    attribute allowExeDefinition { xsd:NCName }?,
+    attribute name { xsd:NCName },
+    attribute requirePermission { xsd:boolean }?,
+    attribute restartOnExternalChanges { xsd:boolean }?,
+    attribute type { text }
+  }
+sectionGroup =
+  element sectionGroup {
+    attribute name { xsd:NCName },
+    attribute type { text }?,
+    (section | sectionGroup)+
+  }
+pages =
+  element pages {
+    attribute clientIDMode { xsd:NCName }?,
+    attribute controlRenderingCompatibilityVersion { xsd:decimal }?,
+    attribute enableEventValidation { xsd:boolean }?,
+    attribute pageBaseType { xsd:NCName }?,
+    attribute theme { text }?,
+    attribute validateRequest { xsd:boolean }?,
+    attribute viewStateEncryptionMode { xsd:NCName }?,
+    element namespaces { add+ }?
+  }
+add =
+  element add {
+    attribute assembly { text }?,
+    attribute binding { xsd:NCName }?,
+    attribute bindingConfiguration { text }?,
+    attribute connectionString { xsd:anyURI }?,
+    attribute initializeData { text }?,
+    attribute input { text }?,
+    attribute key { xsd:NMTOKEN }?,
+    attribute matchType { xsd:NCName }?,
+    attribute modules { xsd:NCName }?,
+    attribute name { xsd:NCName }?,
+    attribute namespace { xsd:NCName }?,
+    attribute negate { xsd:boolean }?,
+    attribute path { text }?,
+    attribute preCondition { text }?,
+    attribute providerName { xsd:NCName }?,
+    attribute resourceType { xsd:NCName }?,
+    attribute responseBufferLimit { xsd:integer }?,
+    attribute scheme { xsd:NCName }?,
+    attribute scriptProcessor { text }?,
+    attribute type { text }?,
+    attribute validate { xsd:boolean }?,
+    attribute value { text }?,
+    attribute verb { text }?
+  }
+Globalization =
+  element Globalization {
+    element ResourceProviders { empty }
+    | add+
+  }
+security =
+  element security {
+    attribute mode { xsd:NCName }?,
+    (element requestFiltering {
+       attribute removeServerHeader { xsd:boolean },
+       element requestLimits {
+         attribute maxAllowedContentLength { xsd:integer }
+       }?
+     }
+     | element transport {
+         attribute clientCredentialType { xsd:NCName }
+       })?
+  }
+system.webServer =
+  element system.webServer {
+    element staticContent {
+      element mimeMap {
+        attribute fileExtension { xsd:NMTOKEN },
+        attribute mimeType { text }
+      }+
+    }?,
+    element rewrite {
+      element rules {
+        element rule {
+          attribute name { xsd:NCName },
+          attribute stopProcessing { xsd:boolean },
+          element match {
+            attribute url { text }
+          },
+          element conditions {
+            attribute logicalGrouping { xsd:NCName },
+            add+
+          },
+          element action {
+            attribute type { xsd:NCName },
+            attribute url { text }
+          }
+        }
+      }
+    }?,
+    element httpErrors {
+      attribute errorMode { xsd:NCName }?,
+      attribute existingResponse { xsd:NCName },
+      (remove+,
+       element error {
+         attribute path { text },
+         attribute prefixLanguageFilePath { text },
+         attribute responseMode { xsd:NCName },
+         attribute statusCode { xsd:integer }
+       }+)?
+    }?,
+    (security
+     | element aspNetCore {
+         attribute arguments { text }?,
+         attribute hostingModel { xsd:NCName },
+         attribute processPath { text },
+         attribute stdoutLogEnabled { xsd:boolean },
+         attribute stdoutLogFile { text }
+       }
+     | element handlers { (add | remove)+ }
+     | element httpProtocol {
+         element customHeaders {
+           element clear { empty }?,
+           remove+
+         }
+       }
+     | element modules {
+         attribute runAllManagedModulesForAllRequests { xsd:boolean }?,
+         (add | remove)*
+       }
+     | element validation {
+         attribute validateIntegratedModeConfiguration { xsd:boolean }
+       })*,
+    element directoryBrowse {
+      attribute enabled { xsd:boolean }
+    }?
+  }
+system.web =
+  element system.web {
+    element authorization {
+      element allow {
+        attribute users { text }
+      }
+    }
+    | (pages
+       | element authentication {
+           attribute mode { xsd:NCName }
+         }
+       | element compilation {
+           attribute debug { xsd:boolean }?,
+           attribute targetFramework { xsd:NMTOKEN }?,
+           attribute tempDirectory { text }?,
+           element assemblies { add+ }?
+         }
+       | element customErrors {
+           attribute defaultRedirect { text }?,
+           attribute mode { xsd:NCName },
+           attribute redirectMode { xsd:NCName }?
+         }
+       | element globalization {
+           attribute requestEncoding { xsd:NCName },
+           attribute responseEncoding { xsd:NCName }
+         }
+       | element httpHandlers { add+ }
+       | element httpModules { add* }
+       | element httpRuntime {
+           attribute appRequestQueueLimit { xsd:integer }?,
+           attribute enableVersionHeader { xsd:boolean }?,
+           attribute executionTimeout { xsd:integer }?,
+           attribute maxRequestLength { xsd:integer }?,
+           attribute minFreeThreads { xsd:integer }?,
+           attribute minLocalRequestFreeThreads { xsd:integer }?,
+           attribute requestPathInvalidCharacters { text }?,
+           attribute requestValidationMode { xsd:decimal }?,
+           attribute targetFramework { xsd:NMTOKEN }?,
+           attribute useFullyQualifiedRedirectUrl { xsd:boolean }?
+         }
+       | element identity {
+           attribute impersonate { xsd:boolean }
+         }
+       | element machineKey {
+           attribute validation { xsd:NCName }
+         }
+       | element sessionState {
+           attribute cookieSameSite { xsd:NCName }?,
+           attribute cookieless { xsd:boolean },
+           attribute mode { xsd:NCName },
+           attribute stateConnectionString { text }?,
+           attribute timeout { xsd:integer }
+         }
+       | element xhtmlConformance {
+           attribute mode { xsd:NCName }
+         })*
+  }
+ns1.add =
+  element ns1:add {
+    attribute name { xsd:NCName },
+    attribute type { text }
+  }
+remove =
+  element remove {
+    attribute name { xsd:NCName }?,
+    attribute statusCode { xsd:integer }?,
+    attribute subStatusCode { xsd:integer }?
+  }
diff --git a/etc/schema/dotnet-build-props.rnc b/etc/schema/dotnet-build-props.rnc
new file mode 100644
index 00000000000..12da068113a
--- /dev/null
+++ b/etc/schema/dotnet-build-props.rnc
@@ -0,0 +1,93 @@
+default namespace = ""
+
+start =
+  element Project {
+    (element Import {
+       attribute Project { text }
+     }
+     | element ItemGroup {
+         attribute Condition { text }?,
+         (element InternalsVisibleTo {
+            attribute Condition { text },
+            attribute Include { text }
+          }
+          | element None {
+              attribute Include { text },
+              attribute Pack { xsd:boolean },
+              attribute PackagePath { text }
+            }
+          | element SourceRoot {
+              attribute Include { text }
+            }
+          | element Using {
+              attribute Include { xsd:NCName }
+            }+
+          | element PackageReference {
+              attribute Include { xsd:NCName },
+              attribute Version { text },
+              (element PrivateAssets { xsd:NCName },
+               element IncludeAssets { text })?
+            }+)
+       }
+     | element PropertyGroup {
+         attribute Condition { text }?,
+         element TargetFramework { xsd:NCName }?,
+         (element DotnetMonoRepoVersion { xsd:NMTOKEN }
+          | element WarningsAsErrors { text }
+          | (element Version {
+               attribute Condition { text },
+               text
+             },
+             element SuperOfficeBuildToolsVersion { xsd:NMTOKEN }))?,
+         (element AccelerateBuildsInVisualStudio { xsd:boolean }
+          | element AnalysisMode { xsd:NCName }
+          | element CentralPackageTransitivePinningEnabled {
+              xsd:boolean
+            }
+          | element CodeAnalysisTreatWarningsAsErrors { xsd:boolean }
+          | element DefaultItemExcludes { text }
+          | element Deterministic { xsd:boolean }
+          | element EnableNETAnalyzers { xsd:boolean }
+          | element GenerateDocumentationFile { xsd:boolean }
+          | element ImplicitUsings { xsd:NCName }
+          | element IsPackable { xsd:boolean }
+          | element LangVersion { xsd:NCName }
+          | element ManagePackageVersionsCentrally { xsd:boolean }
+          | element NoWarn { text }
+          | element Nullable { xsd:NCName }
+          | element TreatWarningsAsErrors { xsd:boolean }
+          | element WarningsNotAsErrors { xsd:NMTOKEN })*,
+         (element AvaloniaVersion { xsd:NMTOKEN }
+          | element SatelliteResourceLanguages { xsd:NCName })?,
+         element ProduceReferenceAssembly { xsd:boolean }?,
+         (element DefaultDocumentationFolder { text },
+          element DefaultDocumentationLinksBaseUrl { text },
+          element DefaultDocumentationLinksOutputFile { text },
+          element DefaultDocumentationExternLinksFiles { text },
+          element DefaultDocumentationConfigurationFile { text })?,
+         element SignAssembly { xsd:boolean }?,
+         (element ContinuousIntegrationBuild { xsd:boolean }
+          | element NetSdk { xsd:NCName })?,
+         (element Product { text },
+          element Company { text },
+          element Copyright { text })?,
+         element AssemblyOriginatorKeyFile { text }?,
+         (element GenerateDocumentation { xsd:boolean }
+          | element RunSettingsFilePath { text }
+          | (element RunNswag { xsd:boolean },
+             element RunNodeBuild { xsd:boolean }))?
+       }
+     | element Target {
+         attribute BeforeTargets { xsd:NCName },
+         attribute Condition { text },
+         attribute Name { xsd:NCName },
+         element RemoveDir {
+           attribute Condition { text },
+           attribute Directories { text }
+         },
+         element Delete {
+           attribute Condition { text },
+           attribute Files { text }
+         }
+       })*
+  }
diff --git a/etc/schema/dotnet-packages-config.rnc b/etc/schema/dotnet-packages-config.rnc
new file mode 100644
index 00000000000..0e10e562b62
--- /dev/null
+++ b/etc/schema/dotnet-packages-config.rnc
@@ -0,0 +1,10 @@
+default namespace = ""
+
+start =
+  element packages {
+    element package {
+      attribute id { xsd:NCName },
+      attribute targetFramework { xsd:NCName }?,
+      attribute version { xsd:NMTOKEN }
+    }+
+  }
diff --git a/etc/schema/dotnet-packages-props.rnc b/etc/schema/dotnet-packages-props.rnc
new file mode 100644
index 00000000000..c91dea94c97
--- /dev/null
+++ b/etc/schema/dotnet-packages-props.rnc
@@ -0,0 +1,21 @@
+default namespace = ""
+
+start =
+  element Project {
+    element PropertyGroup {
+      element ManagePackageVersionsCentrally { xsd:boolean },
+      element CentralPackageTransitivePinningEnabled { xsd:boolean }
+    }?,
+    element ItemGroup {
+      attribute Condition { text }?,
+      (element GlobalPackageReference {
+         attribute Condition { text }?,
+         attribute Include { xsd:NCName },
+         attribute Version { xsd:NMTOKEN }
+       }+
+       | element PackageVersion {
+           attribute Include { xsd:NCName },
+           attribute Version { text }
+         }+)
+    }+
+  }
diff --git a/etc/schema/dotnet-resx.rnc b/etc/schema/dotnet-resx.rnc
new file mode 100644
index 00000000000..26b77e47527
--- /dev/null
+++ b/etc/schema/dotnet-resx.rnc
@@ -0,0 +1,57 @@
+default namespace = ""
+namespace msdata = "urn:schemas-microsoft-com:xml-msdata"
+namespace xsd = "http://www.w3.org/2001/XMLSchema"
+
+start =
+  element root {
+    element xsd:schema {
+      attribute id { xsd:NCName },
+      element xsd:import {
+        attribute namespace { xsd:anyURI }
+      }?,
+      xsd.element
+    },
+    element resheader {
+      attribute name { xsd:NCName },
+      value
+    }+,
+    (element assembly {
+       attribute alias { xsd:NCName },
+       attribute name { text }
+     }
+     | element data {
+         attribute mimetype { text }?,
+         attribute name { text },
+         attribute type { text }?,
+         attribute xml:space { xsd:NCName }?,
+         value
+       }
+     | element metadata {
+         attribute name { xsd:NCName },
+         attribute type { text },
+         value
+       })*
+  }
+xsd.element =
+  element xsd:element {
+    attribute minOccurs { xsd:integer }?,
+    attribute name { xsd:NCName },
+    attribute type { xsd:NMTOKEN }?,
+    attribute msdata:IsDataSet { xsd:boolean }?,
+    attribute msdata:Ordinal { xsd:integer }?,
+    element xsd:complexType {
+      element xsd:choice {
+        attribute maxOccurs { xsd:NCName },
+        xsd.element+
+      }?,
+      element xsd:sequence { xsd.element+ }?,
+      element xsd:attribute {
+        attribute name { xsd:NCName }?,
+        attribute ref { xsd:NMTOKEN }?,
+        attribute type { xsd:NMTOKEN }?,
+        attribute use { xsd:NCName }?,
+        attribute msdata:Ordinal { xsd:integer }?
+      }*
+    }*
+  }
+value = element value { text }
diff --git a/etc/schema/msbuild.rnc b/etc/schema/msbuild.rnc
new file mode 100644
index 00000000000..aa0139cb779
--- /dev/null
+++ b/etc/schema/msbuild.rnc
@@ -0,0 +1,905 @@
+default namespace = ""
+namespace ns1 = "http://schemas.microsoft.com/developer/msbuild/2003"
+
+start = Project | ns1.Project
+Project =
+  element Project {
+    attribute Sdk { text }?,
+    (text
+     | ItemGroup
+     | element Import {
+         attribute Project { text }
+       }
+     | element ProjectExtensions {
+         element VisualStudio {
+           element FlavorProperties {
+             attribute GUID { text },
+             element WebProjectProperties {
+               element UseIIS { xsd:NCName },
+               element AutoAssignPort { xsd:NCName },
+               element DevelopmentServerPort { xsd:integer },
+               element DevelopmentServerVPath { text },
+               element IISUrl { xsd:anyURI },
+               element NTLMAuthentication { xsd:NCName },
+               element UseCustomServer { xsd:NCName },
+               element CustomServerUrl { empty },
+               element SaveServerSettingsInUserFile { xsd:NCName }
+             }
+           }
+         }
+       }
+     | element PropertyGroup {
+         attribute Condition { text }?,
+         attribute Label { xsd:NCName }?,
+         element TargetFrameworks { text }?,
+         element ServiceName { xsd:NCName }?,
+         (element DeployDefaultTargetFrameworkVersion { xsd:decimal },
+          element VisualStudioVersion {
+            attribute Condition { text },
+            xsd:decimal
+          })?,
+         element ClientName { text }?,
+         (element DisableDataAnnotationsParam { text }
+          | element NSwagGenerateExceptionClasses { xsd:boolean })?,
+         element WrapResponseMethods { text }?,
+         (element NSwagOptions { text }
+          | element TargetsForTfmSpecificBuildOutput { text })?,
+         (element SoAssemblyFileVersion {
+            attribute Condition { text },
+            xsd:NMTOKEN
+          },
+          element SoReleaseVersion {
+            attribute Condition { text },
+            text
+          })?,
+         (element WebRoot { text },
+          element WebProjectFile { text },
+          element WebOutputPath { text })?,
+         (element ApiName {
+            attribute Condition { text },
+            xsd:NCName
+          }
+          | element AppConfig { xsd:NCName }
+          | element AppendTargetFrameworkToOutputPath { xsd:boolean }
+          | element ApplicationIcon { text }
+          | element ApplicationManifest { xsd:NCName }
+          | element AspNetCoreHostingModel { xsd:NCName }
+          | element AssemblyName { text }
+          | element AssemblyOriginatorKeyFile { text }
+          | element AssemblyTitle { text }
+          | element AssemblyVersion { xsd:NMTOKEN }
+          | element Authors { text }
+          | element AutoGenerateBindingRedirects {
+              attribute Condition { text }?,
+              xsd:boolean
+            }
+          | element AzureFunctionsVersion { xsd:NCName }
+          | element BicepCompileAfterTargets { xsd:NCName }
+          | element BicepCompileBeforeTargets { xsd:NCName }
+          | element BootstrapperEnabled { xsd:boolean }
+          | element BuildServerSideRenderer { xsd:boolean }
+          | element BuiltInComInteropSupport { xsd:boolean }
+          | element Company { text }
+          | element CopyLocalLockFileAssemblies { xsd:boolean }
+          | element Copyright { text }
+          | element DebugType {
+              attribute Condition { text }?,
+              xsd:NCName
+            }
+          | element DefaultItemExcludes { text }
+          | element DefineConstants { text }
+          | element DelaySign { xsd:boolean }
+          | element Description { text }
+          | element Deterministic { xsd:boolean }
+          | element DisableTransitiveProjectReferences { xsd:boolean }
+          | element DockerDefaultTargetOS { xsd:NCName }
+          | element DockerfileContext { text }
+          | element EmbedUntrackedSources { xsd:boolean }
+          | element EnableCompressionInSingleFile { xsd:boolean }
+          | element EnableDefaultCompileItems { xsd:boolean }
+          | element EnableDefaultEmbeddedResourceItems { xsd:boolean }
+          | element ErrorReport { xsd:NCName }
+          | element FileVersion { xsd:NMTOKEN }
+          | element FindInvalidProjectReferences { xsd:boolean }
+          | element GenerateAssemblyInfo { xsd:boolean }
+          | element GenerateBindingRedirectsOutputType { xsd:boolean }
+          | element GenerateDocumentationFile { xsd:NCName }
+          | element GeneratePackageOnBuild { xsd:NCName }
+          | element GenerateResourceUsePreserializedResources {
+              xsd:boolean
+            }
+          | element ImplicitUsings { xsd:NCName }
+          | element IncludeNativeLibrariesForSelfExtract { xsd:boolean }
+          | element IncludeSymbols { xsd:boolean }
+          | element IsPackable { xsd:boolean }
+          | element LangVersion { xsd:NMTOKEN }
+          | element MapFileExtensions { xsd:boolean }
+          | element NoWarn { text }
+          | element Nullable { xsd:NCName }
+          | element OutputPath { text }
+          | element OutputType { xsd:NCName }
+          | element PackageIcon { text }
+          | element PackageIconUrl { empty }
+          | element PackageId { text }
+          | element PackageLicenseFile { xsd:NCName }
+          | element PackageProjectUrl { xsd:anyURI }
+          | element PackageReleaseNotes { text }
+          | element PackageTags { text }
+          | element PlatformTarget { xsd:NCName }
+          | element Platforms { text }
+          | element Prefer32Bit { xsd:boolean }
+          | element ProduceReferenceAssembly { xsd:NCName }
+          | element Product { text }
+          | element ProjectGuid { text }
+          | element PublishRepositoryUrl { xsd:boolean }
+          | element PublishSingleFile { xsd:boolean }
+          | element RepositoryType { empty }
+          | element RepositoryUrl { empty }
+          | element RestoreProjectStyle { xsd:NCName }
+          | element RootNamespace { text }
+          | element RunPostBuildEvent { xsd:NCName }
+          | element RuntimeIdentifier { xsd:NCName }
+          | element RuntimeIdentifiers { text }
+          | element SatelliteResourceLanguages { xsd:NCName }
+          | element SelfContained { xsd:boolean }
+          | element SignAssembly { xsd:NCName }
+          | element SoVersionOptions { xsd:NCName }
+          | element SpaRoot { text }
+          | element Summary { text }
+          | element SupportedOSPlatformVersion { xsd:decimal }
+          | element SymbolPackageFormat { xsd:NCName }
+          | element TargetFramework { text }
+          | element Title { text }
+          | element TreatWarningsAsErrors { xsd:boolean }
+          | element TypeScriptCompileBlocked {
+              attribute Condition { text }?,
+              xsd:boolean
+            }
+          | element TypeScriptToolsVersion { xsd:NCName }
+          | element UseAppHost { xsd:boolean }
+          | element UseApplicationTrust { xsd:boolean }
+          | element UseWPF { xsd:boolean }
+          | element UseWindowsForms { xsd:boolean }
+          | element UserSecretsId { text }
+          | element Version { text }
+          | element WarningsAsErrors { empty }
+          | element WasmMainJSPath { text })*,
+         (element AvaloniaUseCompiledBindingsByDefault { xsd:boolean }
+          | element _FunctionsSkipCleanOutput { xsd:boolean }
+          | (element ApplicationId { xsd:NCName },
+             element ApplicationVersion { xsd:integer },
+             element ApplicationDisplayVersion { xsd:decimal },
+             element AndroidPackageFormat { xsd:NCName },
+             element AndroidEnableProfiledAot { xsd:NCName })
+          | (element OutDir { text },
+             element ExcludeXmlAssemblyFiles { xsd:boolean }))?,
+         element EnableUnsafeBinaryFormatterSerialization {
+           xsd:boolean
+         }?,
+         (element AssemblySearchPaths { text }
+          | element BaseOutputPath { text }
+          | element ContinuousIntegrationBuild { xsd:boolean }
+          | element DebugSymbols { xsd:boolean }
+          | element DefaultDocumentationIncludeUndocumentedItems {
+              xsd:boolean
+            }
+          | element DscZipFile { text }
+          | element IncludeAllContentForSelfExtract { xsd:boolean }
+          | element IsTestProject { xsd:boolean }
+          | element Optimize { xsd:boolean }
+          | element PackageRequireLicenseAcceptance { xsd:boolean }
+          | element ShouldIncludeNativeSkiaSharp { xsd:NCName }
+          | element StartupObject { xsd:NCName }
+          | (element SccProjectName { xsd:NCName },
+             element SccProvider { xsd:NCName },
+             element SccAuxPath { xsd:NCName },
+             element SccLocalPath { xsd:NCName })
+          | (element CFBundleName { text },
+             element CFBundleDisplayName { text },
+             element CFBundleIdentifier { xsd:NCName },
+             element CFBundleVersion { xsd:NMTOKEN },
+             element CFBundleShortVersionString { xsd:NMTOKEN },
+             element CFBundlePackageType { xsd:NCName },
+             element CFBundleExecutable { xsd:NCName },
+             element CFBundleIconFile { xsd:NCName },
+             element NSPrincipalClass { xsd:NCName },
+             element NSHighResolutionCapable { xsd:boolean }))?
+       }
+     | element Target {
+         attribute AfterTargets { xsd:NCName }?,
+         attribute BeforeTargets { xsd:NCName }?,
+         attribute Condition { text }?,
+         attribute DependsOnTargets { text }?,
+         attribute Inputs { text }?,
+         attribute Name { xsd:NCName },
+         attribute Outputs { text }?,
+         (ItemGroup
+          | element Error {
+              attribute Condition { text },
+              attribute Text { text }
+            }
+          | element Exec {
+              attribute Command { text },
+              attribute Condition { text }?,
+              attribute ContinueOnError { xsd:boolean }?,
+              attribute EnvironmentVariables { text }?,
+              attribute WorkingDirectory { text }?,
+              element Output {
+                attribute PropertyName { xsd:NCName },
+                attribute TaskParameter { xsd:NCName }
+              }?
+            }
+          | element MakeDir {
+              attribute Directories { text }
+            }
+          | element Message {
+              attribute Condition { text }?,
+              attribute Importance { xsd:NCName },
+              attribute Text { text }
+            })*,
+         (element Copy {
+            attribute DestinationFolder { text },
+            attribute SourceFiles { text }
+          }
+          | element MSBuild {
+              attribute BuildInParallel { xsd:boolean },
+              attribute Projects { text },
+              attribute Properties { text },
+              attribute Targets { xsd:NCName }
+            })?
+       })+
+  }
+ns1.Project =
+  element ns1:Project {
+    attribute DefaultTargets { xsd:NCName }?,
+    attribute ToolsVersion { xsd:decimal }?,
+    (text
+     | ns1.ItemGroup
+     | ns1.PropertyGroup
+     | element ns1:Choose {
+         element ns1:When {
+           attribute Condition { text },
+           (ns1.PropertyGroup | ns1.ItemGroup+)
+         }+,
+         element ns1:Otherwise { ns1.ItemGroup }?
+       }
+     | element ns1:Import {
+         attribute Condition { text }?,
+         attribute Label { xsd:NCName }?,
+         attribute Project { text }
+       }
+     | element ns1:ProjectExtensions {
+         element ns1:VisualStudio {
+           element ns1:FlavorProperties {
+             attribute GUID { text },
+             (element ns1:WebProjectProperties {
+                (element ns1:UseIIS { xsd:NCName },
+                 element ns1:AutoAssignPort { xsd:NCName },
+                 element ns1:DevelopmentServerPort { xsd:integer },
+                 element ns1:DevelopmentServerVPath { text },
+                 element ns1:IISUrl { xsd:anyURI },
+                 element ns1:NTLMAuthentication { xsd:NCName },
+                 element ns1:UseCustomServer { xsd:NCName },
+                 element ns1:CustomServerUrl { empty })?,
+                element ns1:SaveServerSettingsInUserFile { xsd:NCName }
+              }
+              | (element ns1:ProjectProperties {
+                   attribute AddItemTemplatesGuid { text },
+                   attribute ApplicationType { xsd:NCName },
+                   attribute DebugInfoExeName { text },
+                   attribute HostName { xsd:NCName },
+                   attribute HostPackage { text },
+                   attribute Language { xsd:NCName },
+                   attribute OfficeVersion { xsd:decimal },
+                   attribute TemplatesPath { xsd:NCName },
+                   attribute VstxVersion { xsd:decimal }
+                 },
+                 element ns1:Host {
+                   attribute GeneratedCodeNamespace { xsd:NCName },
+                   attribute IconIndex { xsd:integer },
+                   attribute Name { xsd:NCName },
+                   attribute PublishedHash { text },
+                   element ns1:HostItem {
+                     attribute Blueprint { xsd:NCName },
+                     attribute CanActivate { xsd:boolean },
+                     attribute CanonicalName { xsd:NCName },
+                     attribute Code { xsd:NCName },
+                     attribute GeneratedCode { xsd:NCName },
+                     attribute IconIndex { xsd:integer },
+                     attribute Name { xsd:NCName },
+                     attribute PublishedHash { text }
+                   }
+                 }))
+           }
+           | element ns1:UserProperties {
+               attribute Name { xsd:NCName }
+             }
+         }
+       }
+     | element ns1:Target {
+         attribute BeforeTargets { xsd:NCName }?,
+         attribute Condition { text }?,
+         attribute Name { xsd:NCName },
+         attribute Outputs { text }?,
+         (element ns1:Copy {
+            attribute ContinueOnError { xsd:boolean }?,
+            attribute DestinationFolder { text },
+            attribute OverwriteReadOnlyFiles { xsd:NCName },
+            attribute SourceFiles { text }
+          }
+          | element ns1:CreateItem {
+              attribute Exclude { text }?,
+              attribute Include { text },
+              ns1.Output
+            }
+          | element ns1:Delete {
+              attribute Files { text },
+              attribute TreatErrorsAsWarnings { xsd:NCName }
+            }
+          | element ns1:Exec {
+              attribute Command { text },
+              attribute WorkingDirectory { text }?
+            }
+          | element ns1:GetVersionParts {
+              attribute AssemblyPath { text },
+              ns1.Output+
+            }
+          | element ns1:Message {
+              attribute Importance { xsd:NCName }?,
+              attribute Text { text }
+            }
+          | element ns1:TokenReplace {
+              attribute Condition { text }?,
+              attribute Destination { text },
+              attribute Path { text },
+              attribute Replacement { text },
+              attribute Token { text }
+            })*,
+         (ns1.PropertyGroup
+          | element ns1:CallTarget {
+              attribute Condition { text }?,
+              attribute Targets { xsd:NCName }
+            }
+          | (ns1.ItemGroup
+             | element ns1:MakeDir {
+                 attribute Directories { text }
+               }
+             | element ns1:WriteCodeFragment {
+                 attribute AssemblyAttributes { text },
+                 attribute Language { text },
+                 attribute OutputFile { text }
+               })*
+          | element ns1:Error {
+              attribute Condition { text },
+              attribute HelpKeyword { xsd:NCName },
+              attribute Text { text }
+            }*)
+       }
+     | element ns1:UsingTask {
+         attribute AssemblyFile { text },
+         attribute TaskFactory { xsd:NCName },
+         attribute TaskName { xsd:NCName },
+         element ns1:ParameterGroup {
+           (element ns1:AssemblyPath {
+              attribute ParameterType { xsd:NCName },
+              attribute Required { xsd:boolean }
+            },
+            element ns1:MajorVersion {
+              attribute Output { xsd:boolean },
+              attribute ParameterType { xsd:NCName }
+            },
+            element ns1:MinorVersion {
+              attribute Output { xsd:boolean },
+              attribute ParameterType { xsd:NCName }
+            },
+            element ns1:BuildVersion {
+              attribute Output { xsd:boolean },
+              attribute ParameterType { xsd:NCName }
+            },
+            element ns1:RevisionVersion {
+              attribute Output { xsd:boolean },
+              attribute ParameterType { xsd:NCName }
+            })
+           | (element ns1:Path {
+                attribute ParameterType { xsd:NCName },
+                attribute Required { xsd:boolean }
+              },
+              element ns1:Destination {
+                attribute ParameterType { xsd:NCName },
+                attribute Required { xsd:boolean }
+              },
+              element ns1:Token {
+                attribute ParameterType { xsd:NCName },
+                attribute Required { xsd:boolean }
+              },
+              element ns1:Replacement {
+                attribute ParameterType { xsd:NCName },
+                attribute Required { xsd:boolean }
+              })
+         },
+         element ns1:Task {
+           element ns1:Using {
+             attribute Namespace { xsd:NCName }
+           }?,
+           element ns1:Code {
+             attribute Language { xsd:NCName },
+             attribute Type { xsd:NCName },
+             text
+           }
+         }
+       })+
+  }
+ItemGroup =
+  element ItemGroup {
+    attribute Condition { text }?,
+    element Using {
+      attribute Alias { xsd:NCName }?,
+      attribute Include { xsd:NCName }
+    }*,
+    element FrameworkReference {
+      attribute Include { xsd:NCName }
+    }?,
+    element _ReferenceCopyLocalPaths {
+      attribute Include { text }
+    }?,
+    element Bicep {
+      attribute Exclude { text }?,
+      attribute Include { text }?,
+      attribute OutputFile { text }?,
+      attribute Update { text }?,
+      element OutputFile { text }?
+    }*,
+    (element AndroidResource {
+       attribute Include { xsd:NCName },
+       Link
+     }
+     | element ApiClientGen {
+         attribute Include { xsd:NCName }
+       }
+     | element Bicepparam {
+         attribute Include { text }
+       }
+     | element BuildOutputInPackage {
+         attribute Include { text },
+         attribute TargetPath { text }
+       }
+     | element DesignData {
+         attribute Include { text }
+       }
+     | element Service {
+         attribute Include { text }
+       }
+     | (element DistFiles {
+          attribute Condition { text }?,
+          attribute Include { text }
+        }+,
+        element ResolvedFileToPublish {
+          attribute Exclude { text },
+          attribute Include { text },
+          element RelativePath { text },
+          CopyToPublishDirectory,
+          ExcludeFromSingleFile?
+        })
+     | element ClaimsRequirement {
+         attribute Include { xsd:NCName }
+       }*
+     | element DocumentName {
+         attribute Include { xsd:NCName }
+       }*
+     | element Folder {
+         attribute Include { text }
+       }*
+     | element Watch {
+         attribute Exclude { text }?,
+         attribute Include { text }?,
+         attribute Remove { text }?
+       }*
+     | element OpenApiReference {
+         attribute ClassName { text }?,
+         attribute Include { text },
+         attribute Namespace { text }?,
+         attribute Options { text }?,
+         element CodeGenerator { xsd:NCName }?
+       }*),
+    element WCFMetadata {
+      attribute Include { text }
+    }?,
+    (element AdditionalFiles {
+       attribute Remove { text }
+     }
+     | element ProjectsToPublish {
+         attribute Include { text }
+       })?,
+    (element Compile {
+       attribute Include { text }?,
+       attribute Link { xsd:NCName }?,
+       attribute Remove { text }?,
+       attribute Update { text }?,
+       Link?,
+       (DependentUpon
+        | element AutoGen { xsd:NCName }
+        | element DesignTime { xsd:NCName })*,
+       (SubType
+        | element DesignTimeSharedInput { xsd:NCName })?
+     }
+     | element Content {
+         attribute CopyToOutputDirectory { xsd:NCName }?,
+         attribute CopyToPublishDirectory { xsd:NCName }?,
+         attribute Exclude { text }?,
+         attribute Include { text }?,
+         attribute Link { text }?,
+         attribute Remove { text }?,
+         attribute Update { text }?,
+         Link?,
+         (CopyToOutputDirectory
+          | CopyToPublishDirectory
+          | DependentUpon
+          | ExcludeFromSingleFile
+          | SubType)*
+       }
+     | element EmbeddedResource {
+         attribute Condition { text }?,
+         attribute Include { text }?,
+         attribute Link { text }?,
+         attribute LogicalName { xsd:NCName }?,
+         attribute Remove { text }?,
+         attribute Update { text }?,
+         (CopyToOutputDirectory
+          | Link
+          | element LogicalName { text })?,
+         element CustomToolNamespace { xsd:NCName }?,
+         (Generator, LastGenOutput)?,
+         (DependentUpon | SubType)?
+       }
+     | element None {
+         attribute CopyToOutputDirectory { xsd:NCName }?,
+         attribute CopyToPublishDirectory { xsd:NCName }?,
+         attribute Exclude { text }?,
+         attribute Include { text }?,
+         attribute Link { xsd:NCName }?,
+         attribute Remove { text }?,
+         attribute Update { text }?,
+         (DependentUpon | SubType)?,
+         Generator?,
+         (LastGenOutput
+          | (element Pack { xsd:NCName }
+             | element PackagePath { empty })*),
+         CopyToOutputDirectory?,
+         CopyToPublishDirectory?
+       }
+     | element Resource {
+         attribute Include { text }
+       }
+     | element WCFMetadataStorage {
+         attribute Include { text }
+       })*,
+    (element AvaloniaXaml {
+       attribute Remove { text }
+     }
+     | element COMReference {
+         attribute Include { xsd:NCName },
+         element Guid { text },
+         element VersionMajor { xsd:integer },
+         element VersionMinor { xsd:integer },
+         element Lcid { xsd:integer },
+         element WrapperTool { xsd:NCName },
+         element Isolated { xsd:NCName },
+         EmbedInteropTypes
+       }
+     | element WasmExtraFilesToDeploy {
+         attribute Include { text }
+       }
+     | element ApiClient {
+         attribute Include { xsd:NCName }
+       }*
+     | (element PackageDownload {
+          attribute Include { xsd:NCName },
+          attribute Version { text }
+        }
+        | element PackageReference {
+            attribute Condition { text }?,
+            attribute ExcludeAssets { xsd:NCName }?,
+            attribute Include { xsd:NCName },
+            attribute PrivateAssets { xsd:NCName }?,
+            attribute Version { text }?,
+            (element IncludeAssets { text }
+             | element PrivateAssets { xsd:NCName })*
+          }
+        | element ProjectReference {
+            attribute Include { text }?,
+            attribute PrivateAssets { xsd:NCName }?,
+            attribute Remove { xsd:NCName }?,
+            (element Properties { text }
+             | (Project,
+                element Name { xsd:NCName }))?
+          }
+        | element Reference {
+            attribute Include { text },
+            (EmbedInteropTypes
+             | element HintPath {
+                 attribute Condition { text }?,
+                 text
+               }
+             | element Private { xsd:NCName }
+             | element SpecificVersion { xsd:NCName })*
+          })*
+     | element AvaloniaResource {
+         attribute Include { text }?,
+         attribute Remove { text }?
+       }*
+     | element TypeScriptCompile {
+         attribute Include { text }?,
+         attribute Remove { text }?,
+         DependentUpon?
+       }*
+     | element Page {
+         attribute Generator { xsd:NMTOKEN }?,
+         attribute Include { text }?,
+         attribute Remove { text }?,
+         attribute SubType { xsd:NCName }?
+       }*)
+  }
+ns1.PropertyGroup =
+  element ns1:PropertyGroup {
+    attribute Condition { text }?,
+    element ns1:__paket__MSTest_TestAdapter_props { text }?,
+    (element ns1:ApplicationManifest { xsd:NCName }
+     | element ns1:__paket__MSTest_TestAdapter_targets { text })?,
+    (element ns1:NugetFolder { text },
+     element ns1:BuildFolder { text })?,
+    element ns1:SoReleaseVersion { text }?,
+    element ns1:__paket__MSTest_TestFramework_targets { text }?,
+    element ns1:SoLegacyVersion { xsd:NCName }?,
+    element ns1:SoBetaTag { empty }?,
+    element ns1:ComputerName { text }?,
+    (element ns1:AppDesignerFolder { xsd:NCName }
+     | element ns1:ApplicationRevision { xsd:integer }
+     | element ns1:ApplicationVersion { text }
+     | element ns1:AssemblyName { xsd:NCName }
+     | element ns1:AssemblyOriginatorKeyFile { text }
+     | element ns1:AutoGenerateBindingRedirects { xsd:boolean }
+     | element ns1:AutoIncrementApplicationRevision { xsd:boolean }
+     | element ns1:BootstrapperEnabled { xsd:boolean }
+     | element ns1:CodeAnalysisRuleSet { xsd:NCName }
+     | element ns1:Configuration {
+         attribute Condition { text },
+         xsd:NCName
+       }
+     | element ns1:DebugSymbols { xsd:boolean }
+     | element ns1:DebugType { xsd:NCName }
+     | element ns1:DefineConstants { text }
+     | element ns1:DependsOnNETStandard { xsd:NCName }
+     | element ns1:Deterministic { xsd:boolean }
+     | element ns1:DocumentationFile { text }
+     | element ns1:EnableUnmanagedDebugging { xsd:boolean }
+     | element ns1:ErrorReport { xsd:NCName }
+     | element ns1:FileAlignment { xsd:integer }
+     | element ns1:FileUpgradeFlags { empty }
+     | element ns1:FindInvalidProjectReferences { xsd:boolean }
+     | element ns1:FriendlyName { xsd:NCName }
+     | element ns1:GenerateBindingRedirectsOutputType { xsd:boolean }
+     | element ns1:IISExpressAnonymousAuthentication { empty }
+     | element ns1:IISExpressSSLPort { text }
+     | element ns1:IISExpressUseClassicPipelineMode { empty }
+     | element ns1:IISExpressWindowsAuthentication { empty }
+     | element ns1:Install { xsd:boolean }
+     | element ns1:InstallFrom { xsd:NCName }
+     | element ns1:InstallUrl { empty }
+     | element ns1:IsCodedUITest { xsd:NCName }
+     | element ns1:IsWebBootstrapper { xsd:NCName }
+     | element ns1:LoadBehavior { xsd:integer }
+     | element ns1:ManifestCertificateThumbprint { text }
+     | element ns1:ManifestKeyFile { text }
+     | element ns1:MapFileExtensions { xsd:boolean }
+     | element ns1:NoStandardLibraries { xsd:boolean }
+     | element ns1:NoWarn { text }
+     | element ns1:NuGetPackageImportStamp { empty }
+     | element ns1:NugetExe { text }
+     | element ns1:OfficeApplicationDescription { empty }
+     | element ns1:OldToolsVersion { xsd:decimal }
+     | element ns1:Optimize { xsd:boolean }
+     | element ns1:OutputPath { text }
+     | element ns1:OutputType { xsd:NCName }
+     | element ns1:PackageDestinationDirectory { text }
+     | element ns1:Platform {
+         attribute Condition { text },
+         xsd:NCName
+       }
+     | element ns1:PlatformTarget { xsd:NCName }
+     | element ns1:Prefer32Bit { xsd:boolean }
+     | element ns1:ProductName { xsd:NCName }
+     | element ns1:ProductVersion { text }
+     | element ns1:ProjectGuid { text }
+     | element ns1:ProjectTypeGuids { text }
+     | element ns1:PublishUrl { text }
+     | element ns1:PublisherName { empty }
+     | element ns1:ReferencePath { text }
+     | element ns1:RestorePackages { xsd:boolean }
+     | element ns1:RootNamespace { xsd:NCName }
+     | element ns1:RunPostBuildEvent { xsd:NCName }
+     | element ns1:SccAuxPath { xsd:anyURI }
+     | element ns1:SccLocalPath { xsd:NMTOKEN }
+     | element ns1:SccProjectName { text }
+     | element ns1:SccProvider { text }
+     | element ns1:SchemaVersion { xsd:decimal }
+     | element ns1:SignAssembly { xsd:boolean }
+     | element ns1:SignManifests { xsd:boolean }
+     | element ns1:SolutionDir {
+         attribute Condition { text },
+         text
+       }
+     | element ns1:StartupObject { empty }
+     | element ns1:SuperOfficeBuildVersion { xsd:NMTOKEN }
+     | element ns1:SuperOfficeDir { text }
+     | element ns1:SuperOfficeTargetDir { text }
+     | element ns1:SupportUrl { empty }
+     | element ns1:TargetCulture { xsd:NCName }
+     | element ns1:TargetFrameworkProfile { text }
+     | element ns1:TargetFrameworkVersion { xsd:NCName }
+     | element ns1:TestProjectType { xsd:NCName }
+     | element ns1:TypeScriptCompileBlocked { xsd:boolean }
+     | element ns1:TypeScriptToolsVersion { xsd:decimal }
+     | element ns1:UpdateEnabled { xsd:boolean }
+     | element ns1:UpdateInterval { xsd:integer }
+     | element ns1:UpdateIntervalUnits { xsd:NCName }
+     | element ns1:UpdateMode { xsd:NCName }
+     | element ns1:UpdatePeriodically { xsd:boolean }
+     | element ns1:UpdateRequired { xsd:boolean }
+     | element ns1:UpgradeBackupLocation { empty }
+     | element ns1:Use64BitIISExpress { empty }
+     | element ns1:UseApplicationTrust { xsd:boolean }
+     | element ns1:UseGlobalApplicationHostFile { empty }
+     | element ns1:UseIISExpress { xsd:boolean }
+     | element ns1:UseVSHostingProcess { xsd:boolean }
+     | element ns1:VSTO_TrustAssembliesLocation { xsd:boolean }
+     | element ns1:VSToolsPath {
+         attribute Condition { text },
+         text
+       }
+     | element ns1:VisualStudioVersion {
+         attribute Condition { text },
+         xsd:decimal
+       }
+     | element ns1:WarningLevel { xsd:integer }
+     | element ns1:WcfConfigValidationEnabled { xsd:NCName })*,
+    (element ns1:ApplicationIcon { xsd:NCName }
+     | element ns1:ErrorText { text }
+     | element ns1:RuntimeIdentifier { xsd:NCName })?,
+    element ns1:PreBuildEvent {
+      attribute Condition { text }?,
+      text
+    }?,
+    (element ns1:OfficeApplication { xsd:NCName }
+     | element ns1:__paket__NETStandard_Library_targets { text }
+     | element ns1:PostBuildEvent {
+         attribute Condition { text }?,
+         text
+       }*)
+  }
+ns1.ItemGroup =
+  element ns1:ItemGroup {
+    (element ns1:AssemblyAttributes {
+       attribute Include { xsd:NCName },
+       element ns1:_Parameter1 { text }
+     }
+     | element ns1:COMReference {
+         attribute Include { xsd:NCName },
+         element ns1:Guid { text },
+         element ns1:VersionMajor { xsd:integer },
+         element ns1:VersionMinor { xsd:integer },
+         element ns1:Lcid { xsd:integer },
+         element ns1:WrapperTool { xsd:NCName },
+         element ns1:Isolated { xsd:NCName },
+         ns1.EmbedInteropTypes
+       }
+     | element ns1:CodeAnalysisDependentAssemblyPaths {
+         attribute Condition { text },
+         attribute Include { text },
+         element ns1:Visible { xsd:NCName }
+       }
+     | element ns1:PackageSourceDirectory {
+         attribute Include { text }
+       }
+     | element ns1:WCFMetadata {
+         attribute Include { text }
+       }
+     | element ns1:Page {
+         attribute Include { text },
+         ns1.Generator,
+         ns1.SubType
+       }*
+     | element ns1:Analyzer {
+         attribute Include { text },
+         ns1.Paket
+       }*
+     | element ns1:Folder {
+         attribute Include { text }
+       }*
+     | element ns1:Service {
+         attribute Include { text }
+       }*
+     | element ns1:PackageReference {
+         attribute Include { xsd:NCName },
+         element ns1:Version { xsd:NMTOKEN }?
+       }*
+     | element ns1:ProjectReference {
+         attribute Include { text },
+         ns1.Project,
+         element ns1:Name { xsd:NCName }
+       }*),
+    element ns1:ApplicationDefinition {
+      attribute Include { xsd:NCName },
+      ns1.Generator,
+      ns1.SubType
+    }?,
+    (element ns1:WebReferences {
+       attribute Include { text }
+     }
+     | element ns1:Reference {
+         attribute Include { text },
+         element ns1:SpecificVersion { xsd:NCName }?,
+         ns1.EmbedInteropTypes?,
+         element ns1:HintPath { text }?,
+         element ns1:Private { xsd:NCName }?,
+         (ns1.Paket
+          | element ns1:RequiredTargetFramework { xsd:decimal })?
+       }*),
+    (element ns1:Compile {
+       attribute Include { text },
+       element ns1:AutoGen { xsd:NCName }?,
+       ns1.Link?,
+       (ns1.DependentUpon
+        | element ns1:DesignTime { xsd:NCName }
+        | element ns1:DesignTimeSharedInput { xsd:NCName })*,
+       ns1.SubType?
+     }
+     | element ns1:Content {
+         attribute Include { text },
+         (ns1.DependentUpon | ns1.SubType)?
+       }
+     | element ns1:EmbeddedResource {
+         attribute Include { text },
+         (ns1.Generator, ns1.LastGenOutput)?,
+         (ns1.DependentUpon | ns1.SubType)?
+       }
+     | element ns1:EntityDeploy {
+         attribute Include { xsd:NCName },
+         ns1.Generator,
+         ns1.LastGenOutput
+       }
+     | element ns1:None {
+         attribute Include { text },
+         element ns1:CopyToOutputDirectory { xsd:NCName }?,
+         ns1.Link?,
+         (ns1.Generator, ns1.LastGenOutput)?,
+         (ns1.DependentUpon | ns1.SubType)?
+       })*,
+    (element ns1:AppDesigner {
+       attribute Include { text }
+     }
+     | element ns1:Resource {
+         attribute Include { text }
+       }*)
+  }
+ns1.Output =
+  element ns1:Output {
+    attribute ItemName { xsd:NCName }?,
+    attribute PropertyName { xsd:NCName }?,
+    attribute TaskParameter { xsd:NCName }
+  }
+CopyToPublishDirectory = element CopyToPublishDirectory { xsd:NCName }
+ExcludeFromSingleFile = element ExcludeFromSingleFile { xsd:boolean }
+Link = element Link { text }
+SubType = element SubType { text }
+DependentUpon = element DependentUpon { text }
+Generator = element Generator { text }
+LastGenOutput = element LastGenOutput { xsd:NCName }
+CopyToOutputDirectory = element CopyToOutputDirectory { xsd:NCName }
+EmbedInteropTypes = element EmbedInteropTypes { xsd:NCName }
+ns1.Generator = element ns1:Generator { xsd:NMTOKEN }
+ns1.SubType = element ns1:SubType { xsd:NCName }
+ns1.EmbedInteropTypes = element ns1:EmbedInteropTypes { xsd:NCName }
+ns1.Paket = element ns1:Paket { xsd:NCName }
+ns1.DependentUpon = element ns1:DependentUpon { xsd:NCName }
+ns1.Link = element ns1:Link { text }
+ns1.LastGenOutput = element ns1:LastGenOutput { xsd:NCName }
diff --git a/etc/schema/nuget.rnc b/etc/schema/nuget.rnc
new file mode 100644
index 00000000000..ab7052e91d1
--- /dev/null
+++ b/etc/schema/nuget.rnc
@@ -0,0 +1,25 @@
+default namespace = ""
+
+start =
+  element configuration {
+    element packageRestore { add+ }?,
+    (element config { add }
+     | element packageSourceMapping {
+         element packageSource {
+           attribute key { xsd:NCName },
+           element package {
+             attribute pattern { text }
+           }
+         }+
+       }
+     | element packageSources {
+         element clear { empty },
+         add+
+       })+
+  }
+add =
+  element add {
+    attribute key { xsd:NCName },
+    attribute protocolVersion { xsd:integer }?,
+    attribute value { xsd:anyURI }
+  }
diff --git a/etc/schema/nuspec.rnc b/etc/schema/nuspec.rnc
new file mode 100644
index 00000000000..a4332f84fc0
--- /dev/null
+++ b/etc/schema/nuspec.rnc
@@ -0,0 +1,100 @@
+namespace a = "http://relaxng.org/ns/compatibility/annotations/1.0"
+default namespace mstns = "http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd"
+namespace rng = "http://relaxng.org/ns/structure/1.0"
+
+dependency =
+  attribute id { xsd:string },
+  attribute version { xsd:string }?,
+  attribute include { xsd:string }?,
+  attribute exclude { xsd:string }?
+dependencyGroup =
+  element dependency { dependency }*,
+  attribute targetFramework { xsd:string }?
+reference = attribute file { xsd:string }
+contentFileEntries =
+  attribute include { xsd:string },
+  attribute exclude { xsd:string }?,
+  attribute buildAction { xsd:string }?,
+  attribute copyToOutput { xsd:boolean }?,
+  attribute flatten { xsd:boolean }?
+referenceGroup =
+  element reference { reference }+,
+  attribute targetFramework { xsd:string }?
+frameworkReference = attribute name { xsd:string }
+frameworkReferenceGroup =
+  element frameworkReference { frameworkReference }*,
+  attribute targetFramework { xsd:string }
+start |= starting_package
+starting_package =
+  element package {
+    element metadata {
+      (element id { xsd:string }
+       & element version { xsd:string }
+       & element title { xsd:string }?
+       & element authors { xsd:string }
+       & element owners { xsd:string }?
+       & element licenseUrl { xsd:anyURI }?
+       & element projectUrl { xsd:anyURI }?
+       & element iconUrl { xsd:anyURI }?
+       & element requireLicenseAcceptance { xsd:boolean }?
+       & element developmentDependency { xsd:boolean }?
+       & element description { xsd:string }
+       & element summary { xsd:string }?
+       & element releaseNotes { xsd:string }?
+       & (element copyright { xsd:string }?)
+         >> a:documentation [
+              "\x{a}" ~
+              "            default value is : en-US"
+            ]
+       & element language { xsd:string }?
+       & element tags { xsd:string }?
+       & element serviceable { xsd:boolean }?
+       & element icon { xsd:string }?
+       & element readme { xsd:string }?
+       & element repository {
+           attribute type { xsd:string }?,
+           attribute url { xsd:anyURI }?,
+           attribute branch { xsd:string }?,
+           attribute commit { xsd:string }?
+         }?
+       & element license {
+           xsd:string,
+           attribute type { xsd:string },
+           attribute version { xsd:string }?
+         }?
+       & element packageTypes {
+           element packageType {
+             attribute name { xsd:string },
+             attribute version { xsd:string }?
+           }*
+         }?
+       & element dependencies {
+           (element dependency { dependency }
+            | element group { dependencyGroup })*
+         }?
+       & element frameworkAssemblies {
+           element frameworkAssembly {
+             attribute assemblyName { xsd:string },
+             attribute targetFramework { xsd:string }?
+           }*
+         }?
+       & element frameworkReferences {
+           element group { frameworkReferenceGroup }*
+         }?
+       & element references {
+           (element reference { reference }
+            | element group { referenceGroup })*
+         }?
+       & element contentFiles {
+           (element files { contentFileEntries })*
+         }?),
+      attribute minClientVersion { xsd:string }?
+    },
+    element files {
+      element file {
+        attribute src { xsd:string },
+        attribute target { xsd:string }?,
+        attribute exclude { xsd:string }?
+      }*
+    }?
+  }
diff --git a/etc/schema/schemas.xml b/etc/schema/schemas.xml
index f04bba849b4..23a23adcbab 100644
--- a/etc/schema/schemas.xml
+++ b/etc/schema/schemas.xml
@@ -66,4 +66,33 @@
   <typeId id="LibreOffice" uri="OpenDocument-schema-v1.3+libreoffice.rnc"/>
   <typeId id="OpenDocument Manifest" uri="od-manifest-schema-v1.2-os.rnc"/>
 
+  <!-- .net development related schemas -->
+  <uri pattern="nuget.config" typeId="Nuget Config" />
+  <typeId id="Nuget Config" uri="nuget.rnc" />
+
+  <uri pattern="*.nuspec" typeId="Nuget Spec" />
+  <namespace ns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd" typeId="Nuget Spec" />
+  <typeId id="Nuget Spec" uri="nuspec.rnc" />
+
+  <uri pattern="web.config" typeId="Dotnet App Config" />
+  <uri pattern="app.config" typeId="Dotnet App Config" />
+  <namespace ns="http://schemas.microsoft.com/.NetConfiguration/v2.0" typeId="Dotnet App Config" />
+  <typeId id="Dotnet App Config" uri="dotnet-appconfig.rnc" />
+
+  <uri pattern="Directory.Build.props" typeId="Dotnet Build Props" />
+  <typeId id="Dotnet Build Props" uri="dotnet-build-props.rnc" />
+
+  <uri pattern="Directory.Packages.props" typeId="Dotnet Packages Props" />
+  <typeId id="Dotnet Packages Props" uri="dotnet-packages-props.rnc" />
+
+  <uri pattern="packages.config" typeId="Dotnet Packages Config" />
+  <typeId id="Dotnet Packages Config" uri="dotnet-packages-config.rnc" />
+
+  <uri pattern="*.resx" typeId="Dotnet Resx" />
+  <typeId id="Dotnet Resx" uri="dotnet-resx.rnc" />
+
+  <uri pattern="*.*proj" typeId="MSBuild" />
+  <documentElement localName="Project" typeId="MSBuild"/>
+  <typeId id="MSBuild" uri="msbuild.rnc" />
+
 </locatingRules>
-- 
2.39.3 (Apple Git-145)

