c# - 使用 C# 究竟如何解析这个有趣的 xml 文档

标签 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";
}

最佳答案

选择条件不明确。假设您在空文本元素之后需要文本元素(使用 Linq to 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"

关于c# - 使用 C# 究竟如何解析这个有趣的 xml 文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14530432/

相关文章:

c# - 通过接口(interface)创建假对象

javascript - 如何禁止点击除对话框以外的任何内容

Android - 使用 JSON 文件中的颜色的最佳方式

c# - 模拟服务提供者 GetServices

.net - WPF 防止动态网格内容超出父级大小

c# - 获取所有标有 [JsonIgnore] 属性的属性

java - 将 XML 配置直接嵌入到 Spring 应用程序上下文中

php - 在将 xml 转换为 php 数组时,空 xml 字段生成空数组而不是空字符串

c# - 将 HTML 转换为多列 PDF

c# - 在我的 C# XAML Windows 8.1 应用程序中,如何进行编程绑定(bind)?