我今天已经开始在WCF反序列化中遇到错误 - 代码已经保持不变并且工作了几个月.
问题是我正在运行时XmlException
说"名称不能以'<'字符开头".我已经调试到.NET源代码,似乎错误是从WCF服务调用反序列化返回对象.这些对象是使用自动属性定义的,并且支持字段似乎给出了类似的名称<MyProperty>k_BackingField
,这是XmlException的来源.
我在网上看到了其他几个参考文献,其中人们接受的解决方案是"我将我的代码更改为不使用自动属性",这对我来说是不可接受的,因为我会有100个对象需要更改,(1000s)其中的属性).此外,当我上周运行它时,这个相同的代码工作正常,并且似乎不会影响所有序列化的DTO,只有一些.
为了让它更令人沮丧,它似乎有点间歇性.今天早上有时候没有例外......!
问题;
更新:经过一天左右的工作正常,这个问题再次出现 - 没有理由我可以找到它为什么会工作/不工作/再次工作,但在这里我们是.
我已经进一步跟踪问题,使用该ServiceKnownType
属性与我在ServiceContracts上的一些代码相关,该属性用于定义序列化的已知类型.似乎虽然报告错误的类型甚至不是我当时正在进行的服务调用的一部分,但是这种错误发生在类型上,这些类型是这种已知类型的"发布"行为的一部分.
当我使用一些代理创建代码来应用某些服务行为时,会出现问题;
IOperationBehavior innerBehavior = new PreserveReferencesOperationBehavior(
description, this.preserveReferences, this.maxItemsInObjectGraph);
innerBehavior.ApplyClientBehavior(description, proxy);
Run Code Online (Sandbox Code Playgroud)
我不能调试ApplyClientBehavior
代码,因为它是System.ServiceModel
(或者我可以吗?)的一部分,但是该方法中的某些东西试图验证我使用我的ServiceKnownType
属性发布的所有类型,并用它打破其中的一些XmlException
.我没有想法为什么有些类型失败 - 而且只是为了它们的一些属性.
这是针对它们报告错误的类型的示例;
[Serializable]
public class MyDataObject
{
public ActivitySession(string id)
{
this.Id = id;
this.IsOpen = true;
}
public string Id { get; set; }
public bool IsValid { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
异常报告错误Id
- > …
我正在尝试在大量的XML文件上使用C#的XmlReader,它们都被正确格式化,除了一些选择的(不幸的是我无法更改它们,因为它会打破很多其他代码).
这些错误只来自这些侵权XML文件的一个特定部分,可以跳过它们,但我不想停止读取XML文件的其余部分.
坏的部分看起来像这样:
<InterestingStuff>
...
<ErrorsHere OptionA|Something = "false" OptionB|SomethingElse = "false"/>
<OtherInterestingStuff>
...
</OtherInterestingStuff>
</InterestingStuff>
Run Code Online (Sandbox Code Playgroud)
所以,如果我可以忽略无效标签,或忽略管道符号,那么我会没事的.
当我看到名称"ErrorsHere"时,尝试使用XmlReader.Skip()不起作用,显然它已经提前读取并抛出异常.
TLDR:我如何跳过这样我可以使用XmlReader读取上面的XML文件?
编辑:
有人建议只更换'|'-symbol,但XmlReader的想法是不加载整个文件但只遍历你想要的部分,因为我直接从文件中读取我无法承受整个文件中的读取,替换"|"的所有实例 然后再次阅读部分:).
在回答这个问题时,我遇到了一个我不理解的情况.OP正在尝试从以下位置加载XML:http://www.google.com/ig/api?weather = 12414&hl =
明显的解决方案是:
string m_strFilePath = "http://www.google.com/ig/api?weather=12414&hl=it";
XmlDocument myXmlDocument = new XmlDocument();
myXmlDocument.Load(m_strFilePath); //Load NOT LoadXml
Run Code Online (Sandbox Code Playgroud)
然而,这失败了
XmlException:给定编码中的字符无效.第1行,第499位.
这似乎是在窒息à
的Umidità
.
OTOH,以下工作正常:
var m_strFilePath = "http://www.google.com/ig/api?weather=12414&hl=it";
string xmlStr;
using(var wc = new WebClient())
{
xmlStr = wc.DownloadString(m_strFilePath);
}
var xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xmlStr);
Run Code Online (Sandbox Code Playgroud)
我为此感到困惑.任何人都可以解释为什么前者失败,但后者工作正常吗?
值得注意的是,文档的xml声明省略了编码.
我正在尝试使用SyndicationFeedFormatter和SyndicationFeed对象解析Rss2,Atom提要.但是我在解析DateTime字段时得到了XmlExceptions,比如pubDate和/或lastBuildDate.
2010年2月24日星期三18:56:04 GMT + 00:00不起作用
2010年2月24日星期三18:56:04 GMT工作
因此,由于时区字段,它正在投掷.
作为一种解决方法,对于熟悉的提要,我会手动修复这些DateTime节点 - 通过捕获XmlException,将Rss加载到XmlDocument中,修复这些节点的值,创建一个新的XmlReader,然后从这个新的XmlReader对象返回格式化程序(代码不是示出).但是对于这种工作方法,我需要事先知道哪些节点导致异常.
SyndicationFeedFormatter syndicationFeedFormatter = null;
XmlReaderSettings settings = new XmlReaderSettings();
using (XmlReader reader = XmlReader.Create(url, settings))
{
try
{
syndicationFeedFormatter = SyndicationFormatterFactory.CreateFeedFormatter(reader);
syndicationFeedFormatter.ReadFrom(reader);
}
catch (XmlException xexp)
{
// fix those datetime nodes with exceptions and read again.
}
return syndicationFeedFormatter;
}
Run Code Online (Sandbox Code Playgroud)
rss feed:http://news.google.com/news?pz = 1&cf = all&aned = us&hl = en&q = test&cf = all&output = rss
例外情况:
第1行中的XmlException错误376.解析XML中的DateTime值时遇到错误.
在System.ServiceModel.Syndication.Rss20FeedFormatter.DateFromString(String dateTimeString,XmlReader reader)
的System.ServiceModel.Syndication.Rss20FeedFormatter.ReadXml(XmlReader reader,SyndicationFeed result)at System.ServiceModel.Syndication.Rss20FeedFormatter.ReadFrom(XmlReader …
我正在使用Silverlight项目中的XmlReader编写文件阅读器.但是,我遇到了一些错误(特别是围绕XmlReader.ReadStartElement方法),这让我误以为我误解了如何在途中使用它.
基本上,这是我正在使用的Xml格式的示例:
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<root>
<EmptyElement />
<NonEmptyElement Name="NonEmptyElement">
<SubElement Name="SubElement" />
</NonEmptyElement>
</root>
Run Code Online (Sandbox Code Playgroud)
以下是一些代码的示例,其使用方式与我使用它的方式相同:
public void ReadData(XmlReader reader)
{
// Move to root element
reader.ReadStartElement("root");
// Move to the empty element
reader.ReadStartElement("EmptyElement");
// Read any children
while(reader.ReadToNextSibling("SubEmptyElement"))
{
// ...
}
// Read the end of the empty element
reader.ReadEndElement();
// Move to the non empty element
reader.ReadStartElement("NonEmptyElement"); // NOTE: This is where I get the error.
// ...
}
Run Code Online (Sandbox Code Playgroud)
所以,基本上,我只是想读取每个元素和任何包含的子元素.我在突出显示的点上得到的错误如下:
错误说明
[Xml_InvalidNodeType]参数:无,10,8调试资源字符串不可用.通常,密钥和参数提供了足够的信息来诊断问题.请参阅http://go.microsoft.com/fwlink/?linkid=106663&Version=4.0.51204.0&File=System.Xml.dll&Key=Xml_InvalidNodeType
错误堆栈跟踪
在----------------的System.Xml.XmlReader.ReadStartElement(String name) …
使用C#的XmlSerializer。
在反序列化给定文件夹中的所有xml文件的过程中,我看到XmlException "There is an error in XML document (0, 0)".
和InnerException是"There is no Unicode byte order mark. Cannot switch to Unicode".
。目录中的所有xml
都是“ UTF-16”编码的。唯一的区别是,某些xml文件缺少在反序列化期间我正在使用其对象的类中定义的元素。
例如,考虑我的文件夹中有3种不同类型的xml:
file1.xml
<?xml version="1.0" encoding="utf-16"?>
<ns0:PaymentStatus xmlns:ns0="http://my.PaymentStatus">
</ns0:PaymentStatus>
Run Code Online (Sandbox Code Playgroud)
file2.xml
<?xml version="1.0" encoding="utf-16"?>
<ns0:PaymentStatus xmlns:ns0="http://my.PaymentStatus">
<PaymentStatus2 RowNum="1" FeedID="38" />
</ns0:PaymentStatus>
Run Code Online (Sandbox Code Playgroud)
file3.xml
<?xml version="1.0" encoding="utf-16"?>
<ns0:PaymentStatus xmlns:ns0="http://my.PaymentStatus">
<PaymentStatus2 RowNum="1" FeedID="38" />
<PaymentStatus2 RowNum="2" FeedID="39" Amt="26.0000" />
</ns0:PaymentStatus>
Run Code Online (Sandbox Code Playgroud)
我有一个代表上述xml的类:
[XmlTypeAttribute(AnonymousType = true, Namespace = "http://my.PaymentStatus")]
[XmlRootAttribute("PaymentStatus", Namespace = "http://http://my.PaymentStatus", IsNullable = true)]
public class PaymentStatus
{
private …
Run Code Online (Sandbox Code Playgroud) 如何解决生成的异常?
public static string[] getKeywords(string filename)
{
var xmlFile = new XElement(filename);
string[] keywords = xmlFile.Elements("Keyword")
.Attributes("name")
.Select(n => n.Value).ToArray();
return keywords;
}
Run Code Online (Sandbox Code Playgroud)
这会生成此异常:
System.Xml.XmlException未处理Message ='/'字符,十六进制值0x2F,不能包含在名称中.来源=的System.Xml