我正在升级一些旧的解决方案,并且在自动迁移并在迁移报告中列出后,很少有项目遇到以下错误
名称不能以'?'开头字符,十六进制值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 ...
我认为这是错误消息的真正来源。但是,仍然不知道为什么或如何解决。
答案 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规则的所有可能方式。