名称不能以“?”开头字符,十六进制值0x3F

时间:2019-06-11 10:33:20

标签: xml visual-studio-2017 projects-and-solutions

我正在升级一些旧的解决方案,并且在自动迁移并在迁移报告中列出后,很少有项目遇到以下错误

  

名称不能以'?'开头字符,十六进制值0x3F。线   1,位置3。

我在互联网上进行了一些研究,但找不到字符是?的结果。

我检查了

  

名称不能以''字符开头,十六进制值0x20
  名称不能以'$'字符开头,十六进制值为0x24

但是解决方案似乎不适合我的情况。

我调查了csproj并通过在线工具对xml进行了验证,一切似乎都很好。

失败的项目似乎是ASP.NET站点或SOAP Web服务。

其中一个csproj中的内容

<?xml version="1.0" encoding="utf-8"?>
<VisualStudioProject>
  <CSHARP ProjectType="Web" ProductVersion="7.10.3077" SchemaVersion="2.0" ProjectGuid="{9CCCD8A9-8CEF-4FFF-80C6-8123FC554342}" SccProjectName="SAK" SccLocalPath="SAK" SccAuxPath="SAK" SccProvider="SAK">
    <Build>
      <Settings ApplicationIcon="" AssemblyKeyContainerName="" AssemblyName="PortalHome" AssemblyOriginatorKeyFile="" DefaultClientScript="JScript" DefaultHTMLPageLayout="Grid" DefaultTargetSchema="IE50" DelaySign="false" OutputType="Library" PreBuildEvent="" PostBuildEvent="" RootNamespace="PortalHome" RunPostBuildEvent="OnBuildSuccess" StartupObject="">
        <Config Name="Debug" AllowUnsafeBlocks="false" BaseAddress="285212672" CheckForOverflowUnderflow="false" ConfigurationOverrideFile="" DefineConstants="DEBUG;TRACE" DocumentationFile="" DebugSymbols="true" FileAlignment="4096" IncrementalBuild="false" NoStdLib="false" NoWarn="" Optimize="false" OutputPath="bin\" RegisterForComInterop="false" RemoveIntegerChecks="false" TreatWarningsAsErrors="false" WarningLevel="4" />
        <Config Name="Release" AllowUnsafeBlocks="false" BaseAddress="285212672" CheckForOverflowUnderflow="false" ConfigurationOverrideFile="" DefineConstants="TRACE" DocumentationFile="" DebugSymbols="false" FileAlignment="4096" IncrementalBuild="false" NoStdLib="false" NoWarn="" Optimize="true" OutputPath="bin\" RegisterForComInterop="false" RemoveIntegerChecks="false" TreatWarningsAsErrors="false" WarningLevel="4" />
      </Settings>
      <References>
        <Reference Name="System" AssemblyName="System" HintPath="..\..\..\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.dll" />
        <Reference Name="System.Drawing" AssemblyName="System.Drawing" HintPath="..\..\..\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.Drawing.dll" />
        <Reference Name="System.Data" AssemblyName="System.Data" HintPath="..\..\..\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.Data.dll" />
        <Reference Name="System.Web" AssemblyName="System.Web" HintPath="..\..\..\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.Web.dll" />
        <Reference Name="System.XML" AssemblyName="System.Xml" HintPath="..\..\..\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.XML.dll" />
        <Reference Name="System.Web.Mobile" AssemblyName="System.Web.Mobile" HintPath="..\..\..\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.Web.Mobile.dll" />
      </References>
    </Build>
    <Files>
      <Include>
        <File RelPath="AssemblyInfo.cs" BuildAction="Compile" />
        <File RelPath="Default.aspx" BuildAction="Content" />
        <File RelPath="Default.aspx.cs" DependentUpon="Default.aspx" SubType="ASPXCodeBehind" BuildAction="Compile" />
        <File RelPath="Global.asax" SubType="Component" BuildAction="Content" />
        <File RelPath="Global.asax.cs" DependentUpon="Global.asax" SubType="Code" BuildAction="Compile" />
        <File RelPath="Global.asax.resx" DependentUpon="Global.asax.cs" BuildAction="EmbeddedResource" />
        <File RelPath="Web.config" BuildAction="Content" />
      </Include>
    </Files>
  </CSHARP>
</VisualStudioProject>

我想我找到了一个线索。

当我双击csproj时,它将创建一个vs2D44.tmp之类的tmp文件。 xml格式并包含

<??>
<VisualStudioProject>
    <CSHARP
        ProductVersion = "7.10.3077"
        SchemaVersion = "2.0"
something ...

我认为这是错误消息的真正来源。但是,仍然不知道为什么或如何解决。

2 个答案:

答案 0 :(得分:0)

通过在XmlReaderSettings中将CheckCharacters = false尝试。参见下文,例如-

using System.Xml;
XDocument doc = null
XmlReaderSettings settings = new XmlReaderSettings { CheckCharacters = false };
using (XmlReader reader = //xml) { doc = XDocument.Load(reader); }

然后继续阅读XML。

这应该停止XML Reader,以检查给定的XML是否具有“非法”字符,如果存在,则抛出异常。默认情况下是这样。

在此处查找有关合法字符,标准和其他信息的更多信息-https://docs.microsoft.com/en-us/dotnet/api/system.xml.xmlreadersettings.checkcharacters?view=netframework-4.8

答案 1 :(得分:0)

您说您有一个“是XML格式的文件,其中包含<??>

嗯,这是一个矛盾。如果它包含<??>,则它不是XML格式。

当您获得包含损坏的XML的文件时,应该像购买一套损坏的眼镜一样进行操作:将它们带回供应商,要求更换或退款。如果无法做到这一点,则必须找到自己的修复方式。周围有一些工具可以为您提供帮助,例如TagSoup,但从本质上讲,它们无法处理打破XML规则的所有可能方式。