C# 如何读取单个类属性中的不同XML元素?
我有一个C# 如何读取单个类属性中的不同XML元素?,c#,xml,xsd,C#,Xml,Xsd,我有一个xsd.exeoutput c#类: [System.CodeDom.Compiler.GeneratedCodeAttribute(“xsd”、“4.6.1055.0”)] [System.SerializableAttribute()] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute(“代码”)] 公共部分课程 { 私有十进制xFi
xsd.exe
output c#类:
[System.CodeDom.Compiler.GeneratedCodeAttribute(“xsd”、“4.6.1055.0”)]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute(“代码”)]
公共部分课程
{
私有十进制xField;
私人领域;
///
公共十进制x
{
得到
{
返回此.xField;
}
设置
{
this.xField=值;
}
}
///
公共十进制
{
得到
{
返回此.yField;
}
设置
{
this.yField=值;
}
}
}
而且XML很简单:
<ordinate>
<x>587865.52</x>
<y>1397457.84</y>
</ordinate>
587865.52
1397457.84
但是,XML看起来像:
<ordinate>
<x>587865.52</x>
<_y>1397457.84</_y>
</ordinate>
587865.52
1397457.84
我如何用一个类来阅读这些简单的内容
以下是xsd切片:
<xsd:complexType name="OrdinateOut">
<xsd:annotation>
<xsd:documentation>Parcel coordinates</xsd:documentation>
</xsd:annotation>
<xsd:sequence>
<xsd:element name="x" type="xsd:decimal">
<xsd:annotation>
<xsd:documentation>Ordinate X</xsd:documentation>
</xsd:annotation>
</xsd:element>
<xsd:element name="y" type="xsd:decimal">
<xsd:annotation>
<xsd:documentation>Ordinate Y</xsd:documentation>
</xsd:annotation>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
地块坐标
纵坐标X
纵坐标Y
一种可能的解决方案是,作为预处理步骤,应用xslt来转换xml文件,而不是根据您的模式。应用于已经正确格式化的xml文件应该是安全的
例如,此xslt将所有坐标/_y
元素重命名为坐标/y
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="ordinate/_y">
<y><xsl:apply-templates select="@*|node()" /></y>
</xsl:template>
</xsl:stylesheet>
您可以在此基础上进行测试,并提供了一些关于如何在C#中使用XSLT的示例,只需谷歌一下:)
编辑:我忘记了强力方式:在解析文件之前,在文件中替换字符串
和
。我不建议这样做,但它可能是一种解决方案。一种可能的解决方案是,作为预处理步骤,应用xslt来转换xml文件,而不是根据您的模式。应用于已经正确格式化的xml文件应该是安全的
例如,此xslt将所有坐标/_y
元素重命名为坐标/y
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="ordinate/_y">
<y><xsl:apply-templates select="@*|node()" /></y>
</xsl:template>
</xsl:stylesheet>
您可以在此基础上进行测试,并提供了一些关于如何在C#中使用XSLT的示例,只需谷歌一下:)
编辑:我忘记了强力方式:在解析文件之前,在文件中替换字符串
和
。我不建议这样做,但它可能是一种解决方案。您使用的是私有变量xField和yField。因此,只需创建一个新属性,像这样保存到xField和yField
public decimal _y
{
get
{
return this.yField;
}
set
{
this.yField = value;
}
}
您正在使用私有变量xField和yField。因此,只需创建一个新属性,像这样保存到xField和yField
public decimal _y
{
get
{
return this.yField;
}
set
{
this.yField = value;
}
}
是什么产生了xml文件中的
\y
元素?您能给我们看一下您的xsd文件吗?@Samuel\u y
不是有效的xsd架构。但是这里有太多带有\u y
的xml文档,我不能忽略它。不熟悉C代码,这个问题是关于更改自动生成XSD的C代码,还是关于更改XSD以使显示的两个xml文档都有效?是什么在xml文件中生成\u y
元素?您能给我们看一下您的xsd文件吗?@Samuel\u y
不是有效的xsd架构。但是这里有太多带有\u y
的xml文档,我不能忽略它。我不熟悉C代码,这个问题是关于更改自动生成XSD的C代码,还是关于更改XSD以使您显示的两个xml文档都有效?我认为实际尝试修改(生成的)是有问题的架构文件,强制它根据架构规范接受无效元素。我宁愿建议创建一个转换步骤,将无效的xml文件转换为有效的xml文件。我认为这将导致更干净的C代码,因为这样您就不会在代码本身中处理不兼容的xml文件。你对此有什么看法?我不是说要修改模式。生成文件的人从未进行过架构检查。我只是说最好的解决方案就是通过添加额外的属性来修改类。除非您想使用您所说的其他网络库方法自定义解析整个xml,否则这是最佳选择。如果我错了,请纠正我:他需要调整生成代码的模式,以实际引入使用y
或\u y
的功能,否则xml解析器将无法使用我真的能看懂它,还是我错了?如果设置了\u y
,但未设置y
,解析器应该做什么y
不可为空,因此它将抛出
或使用默认值(十进制)
,并且xml文件的使用者不知道要使用哪个字段?反序列化时不会自动进行模式检查(即使模式在xml中)。因此,不需要对模式进行任何更改。如果返回并使用xsd.exe之类的工具自动创建类,那么每次运行xsd.exe时,都需要添加新属性。但希望在生成新的xml文件时可以解决这个问题,所以在根本原因得到解决之前,这个问题只是一个临时的解决方案。我可能不会包括set属性,因此只有读取才会查找_y@jdweng你的解决方案很好用。确实,这是临时解决方案,因为当前的xsd模式只是一个项目,尚未正式接受。我认为实际尝试修改(生成的)模式文件以强制其根据模式规范接受无效元素是有问题的。我宁愿建议创建一个转换步骤,将无效的xml文件转换为有效的xml文件。我认为这将导致更干净的C代码,因为这样您就不会在代码本身中处理不兼容的xml文件。你的目标是什么