准确地使用C#如何解析这个有趣的xml文档

时间:2013-01-25 21:08:45

标签: c# .net xml xml-parsing xmldocument

从下面的文件中

  <?xml version="1.0" ?> 
- <XMLScreen xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <CX>80</CX> 
  <CY>24</CY> 
  <Formatted>true</Formatted> 
- <Field>
  <Location position="1" left="1" top="0" length="61" /> 
  <Attributes Base="226" Protected="false" FieldType="High" /> 
  *DIU DISPATCH INQUIRY AND UPDATE 
  </Field>
- <Field>
  <Location position="63" left="63" top="0" length="17" /> 
  <Attributes Base="204" Protected="true" /> 
  12:34:48 01/25/13 
  </Field>
- <Field>
  <Location position="80" left="0" top="1" length="5" /> 
  <Attributes Base="204" Protected="true" /> 
  TECH: 
  </Field>
- <Field>
  <Location position="86" left="6" top="1" length="4" /> 
  <Attributes Base="234" Protected="false" FieldType="High" /> 
  0001 
  </Field>
- <Field>
  <Location position="91" left="11" top="1" length="6" /> 
  <Attributes Base="204" Protected="true" /> 
  DATE: 
  </Field>
- <Field>
  <Location position="98" left="18" top="1" length="4" /> 
  <Attributes Base="234" Protected="false" FieldType="High" /> 
  0126 
  </Field>
- <Field>
  <Location position="103" left="23" top="1" length="6" /> 
  <Attributes Base="204" Protected="true" /> 
  TYPE: 
  </Field>
- <Field>
  <Location position="110" left="30" top="1" length="2" /> 
  <Attributes Base="226" Protected="false" FieldType="High" /> 
  </Field>
- <Field>
  <Location position="113" left="33" top="1" length="6" /> 
  <Attributes Base="204" Protected="true" /> 
  RESN: 
  </Field>
- <Field>
  <Location position="120" left="40" top="1" length="2" /> 
  <Attributes Base="226" Protected="false" FieldType="High" /> 
  </Field>
- <Field>
  <Location position="123" left="43" top="1" length="10" /> 
  <Attributes Base="204" Protected="true" /> 
  GEO CODE: 
  </Field>
- <Field>
  <Location position="134" left="54" top="1" length="1" /> 
  <Attributes Base="226" Protected="false" FieldType="High" /> 
  </Field>
- <Field>
  <Location position="136" left="56" top="1" length="9" /> 
  <Attributes Base="226" Protected="false" FieldType="High" /> 
  </Field>
- <Field>
  <Location position="146" left="66" top="1" length="11" /> 
  <Attributes Base="204" Protected="true" /> 
  DISP STAT: 
  </Field>
- <Field>
  <Location position="158" left="78" top="1" length="1" /> 
  <Attributes Base="226" Protected="false" FieldType="High" /> 
  </Field>
- <Field>
  <Location position="160" left="0" top="2" length="58" /> 
  <Attributes Base="204" Protected="true" /> 
  OPEN/UNTS:00001 00015 CMPL/UNTS:00000 00000 UNABLES:0000 
  </Field>
- <Field>
  <Location position="219" left="59" top="2" length="5" /> 
  <Attributes Base="204" Protected="true" /> 
  SPA: 
  </Field>
- <Field>
  <Location position="225" left="65" top="2" length="4" /> 
  <Attributes Base="234" Protected="false" FieldType="High" /> 
  8155 
  </Field>
- <Field>
  <Location position="230" left="70" top="2" length="4" /> 
  <Attributes Base="234" Protected="false" FieldType="High" /> 
  </Field>
- <Field>
  <Location position="235" left="75" top="2" length="4" /> 
  <Attributes Base="234" Protected="false" FieldType="High" /> 
  </Field>
- <Field>
  <Location position="240" left="0" top="3" length="11" /> 
  <Attributes Base="204" Protected="true" /> 
  TECH NOTES: 
  </Field>
- <Field>
  <Location position="252" left="12" top="3" length="65" /> 
  <Attributes Base="226" Protected="false" FieldType="High" /> 
  </Field>
- <Field>
  <Location position="318" left="78" top="3" length="2" /> 
  <Attributes Base="204" Protected="true" /> 
  </Field>
- <Field>
  <Location position="320" left="0" top="4" length="80" /> 
  <Attributes Base="204" Protected="true" /> 
  TYPE RESN JOB # ST/TME ADDRESS TIME UN ZIP CODE DATE 
  </Field>
- <Field>
  <Location position="400" left="0" top="5" length="2" /> 
  <Attributes Base="204" Protected="true" /> 
  01 
  </Field>
- <Field>
  <Location position="403" left="3" top="5" length="19" /> 
  <Attributes Base="206" Protected="true" FieldType="High" /> 
  AF 01 437804 
  </Field>
- <Field>
  <Location position="423" left="23" top="5" length="1" /> 
  <Attributes Base="226" Protected="false" FieldType="High" /> 
  R 
  </Field>
- <Field>
  <Location position="425" left="25" top="5" length="4" /> 
  <Attributes Base="206" Protected="true" FieldType="High" /> 
  0753 
  </Field>
- <Field>
  <Location position="480" left="0" top="6" length="60" /> 
  <Attributes Base="206" Protected="true" FieldType="High" /> 
  CUST REQ: Y 
  </Field>
- <Field>
  <Location position="541" left="61" top="6" length="5" /> 
  <Attributes Base="207" Protected="true" FieldType="Hidden" /> 
  2000 
  </Field>
- <Field>
  <Location position="547" left="67" top="6" length="13" /> 
  <Attributes Base="207" Protected="true" FieldType="Hidden" /> 
  0360 
  </Field>
- <Field>
  <Location position="560" left="0" top="7" length="3" /> 
  <Attributes Base="207" Protected="true" FieldType="Hidden" /> 
  </Field>
- <Unformatted>
  <Text>*DIU DISPATCH INQUIRY AND UPDATE 12:34:48 01/25/13</Text> 
  <Text>TECH: 0001 DATE: 0126 TYPE: RESN: GEO CODE: DISP STAT:</Text> 
  <Text>OPEN/UNTS:00001 00015 CMPL/UNTS:00000 00000 UNABLES:0000 SPA: 8155</Text> 
  <Text>TECH NOTES:</Text> 
  <Text>TYPE RESN JOB # ST/TME ADDRESS TIME UN ZIP CODE DATE</Text> 
  <Text /> 
  <Text /> 
  <Text /> 
  <Text /> 
  <Text /> 
  <Text /> 
  <Text /> 
  <Text /> 
  <Text /> 
  <Text /> 
  <Text /> 
  <Text /> 
  <Text /> 
  <Text>PF6=NOTE/RESL PF7=BWD PF8=FWD PF9=NEXT PF11=OPEN W/OS NO MORE W/OS</Text> 
  <Text>DIU22E-PAGING ERROR, ONLY ONE PAGE</Text> 
  </Unformatted>
  </XMLScreen>

我试图仅解析带有文本的行,例如最后两行:

  <Text>PF6=NOTE/RESL PF7=BWD PF8=FWD PF9=NEXT PF11=OPEN W/OS NO MORE W/OS</Text> 
  <Text>DIU22E-PAGING ERROR, ONLY ONE PAGE</Text> 

我认为我接近我的最新代码,但我是XML解析的新手:

public static string GetTextByLocationIdNoNull(XmlDocument xmlDoc, int nodeId)
{
    string field;
    XmlNode node = xmlDoc.SelectSingleNode(String.Format(@"//Location[@position='{0}']", nodeId));
    if (node != null)
    {
        return field = node.ParentNode.InnerText;
    }
    return "Null";
}

1 个答案:

答案 0 :(得分:4)

选择条件不明确。假设在空文本元素之后需要文本元素(使用Linq到Xml的解决方案):

XDocument xdoc = XDocument.Load(path_to_xml);
var query = xdoc.Root.Element("Unformatted")
                .Elements("Text")
                .SkipWhile(t => !t.IsEmpty)
                .SkipWhile(t => t.IsEmpty)
                .Select(t => (string)t);

返回:

"PF6=NOTE/RESL PF7=BWD PF8=FWD PF9=NEXT PF11=OPEN W/OS NO MORE W/OS"
"DIU22E-PAGING ERROR, ONLY ONE PAGE"