Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何读取单个类属性中的不同XML元素?_C#_Xml_Xsd - Fatal编程技术网

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文件。你的目标是什么