如何将XML中的特定字段解析为c#类?

时间:2014-03-07 17:40:12

标签: c# xml parsing xml-parsing xsd

我的XML看起来像这样:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="http://ocrsdk.com/schema/resultDescription-1.0.xsd      http://ocrsdk.com/schema/resultDescription-1.0.xsd"      xmlns="http://ocrsdk.com/schema/resultDescription-1.0.xsd">
 <page index="0">
<text id="print" left="160" top="349" right="339" bottom="384">
  **<value>Vertraqsnummer:</value>**
  <line left="167" top="366" right="326" bottom="384">
    <char left="167" top="366" right="180" bottom="382">V</char>
    <char left="287" top="370" right="302" bottom="382">
      <charRecVariants>
        <variant charConfidence="22">m</variant>
        <variant charConfidence="-1">rn</variant>
      </charRecVariants>m</char>
    <char left="304" top="370" right="314" bottom="382">e</char>
    <char left="316" top="370" right="322" bottom="382">r</char>
    <char left="324" top="370" right="326" bottom="382" suspicious="true">:</char>
  </line>
</text>
<text id="handprint" left="387" top="1035" right="635" bottom="1089">
  **<value>309.05</value>**
  <line left="398" top="1045" right="633" bottom="1089">
    <char left="398" top="1052" right="426" bottom="1088">3</char>
    <char left="423" top="1061" right="455" bottom="1089" suspicious="true">0</char>
    <char left="546" top="1045" right="633" bottom="1089" suspicious="true">5</char>
  </line>
</text>
<checkmark id="checked" left="883" top="427" right="928" bottom="469">
  **<value>checked</value>**
</checkmark>
<checkmark id="not checked" left="884" top="511" right="928" bottom="554">
  **<value>unchecked</value>**
</checkmark>
<barcode id="leftBarcode" left="46" top="1048" right="128" bottom="1350">
  <value encoding="Base64">QkYxMDExNQ==</value>
</barcode>

我希望只能解析写入XXX的字段,取内部值并将其放在我的c#类字段下。

例如,对于这个XML,我想采用这些值:

 **<value>Vertraqsnummer:</value>**
**<value>309.05</value>**
 **<value>checked</value>**

例如使用“A”类:

class A
{
   public string s1;
   public string s2;
   public string s3;
}

我的结果应该是: s1 = Vertraqsnummer s2 = 309.05 s3 =已检查

我在这里看了一些问题,但我唯一注意到的是我可以使用XsdObjectGen或XSD.exe。问题在于它们采用整个XML而不仅仅是我需要的部分。

任何帮助都会非常受欢迎!

1 个答案:

答案 0 :(得分:2)

XmlNamespaceManager nsMgr = new XmlNamespaceManager(new NameTable());
nsMgr.AddNamespace("ns", "http://ocrsdk.com/schema/resultDescription-1.0.xsd");

var result = XDocument.Load(filename)
    .XPathSelectElements("//ns:text/ns:value|//ns:checkmark[@id='checked']/ns:value", nsMgr)
    .Select(x => x.Value)
    .ToList();

或没有XPATH

XNamespace ns = "http://ocrsdk.com/schema/resultDescription-1.0.xsd";
var xDoc = XDocument.Load(filename);

var result = xDoc.Descendants(ns + "text")
            .Union(xDoc.Descendants(ns + "checkmark").Where(c => (string)c.Attribute("id") == "checked"))
            .Select(x => x.Element(ns + "value").Value)
            .ToList();