【问题标题】:reading xml using xml parser使用 xml 解析器读取 xml
【发布时间】:2014-11-25 04:04:43
【问题描述】:

我需要获取用户ID对应的终端ID。任何帮助。但它给出了错误:

节点类型不支持 ReadElementContentAsString 方法 没有。第 1 行,位置 668。

 string strTerminalId = "E";
 XmlDocument xdoc = new XmlDocument();
 xdoc.LoadXml(STRING); //
 string strxml = xdoc.OuterXml;
 string strUserName = "";
 bool Flag = false;

 using (XmlReader reader = XmlReader.Create(new StringReader(strxml)))
 {
     while (reader.Read())
     {
         if (reader.IsStartElement())
         {
             switch (reader.Name)
             {
                 case "Row":
                     reader.Read();
                     if (Flag == false)
                     {
                         reader.ReadToFollowing("TERM-ID");
                         reader.Read();
                         string strTERMID = reader.ReadElementContentAsString().ToString();
                          if (strTERMID == strTerminalId)
                                {
                                    while (reader.ReadToFollowing("NA") && (Flag == false))
                                    {
                                        reader.Read();
                                        string strUser = reader.ReadContentAsString();
                                        if (strUser == "NA")
                                        {
                                            reader.ReadToFollowing("c:value");
                                            reader.Read();
                                            strUserName = reader.ReadContentAsString();
                                            Flag = true;
                                        }
                                    }
                                }
                            }
                            break;
                    }
                }
            }

XML 文档的内容是

<GetReferenceTableResponse xmlns='http://tempuri.org/'>
    <GetReferenceTableResult> 
        <Table Name='C' ID='46899' xmlns=''>   
            <Columns>
            <Col ID='7442' Name='TD' Datatype='T' Length='8' AttributeDescription='Terminal ID' IsKey='Y'/>
            <Col ID='7443' Name='D' Datatype='T' Length='50' AttributeDescription='Description' IsKey=' '/>
            <Col ID='7444' Name='U' Datatype='T' Length='8' AttributeDescription='USER-ID' IsKey='' />
            </Columns> 
            <Rows>
                <Row RowsetID=\"1\">
                    <TERM-ID ID='279598'>A</TERM-ID>
                    <DESC-TXT ID='279622'>ASC</DESC-TXT>  
                    <USER-ID ID='279646'>A</USER-ID>
                </Row>
            </Rows> 
        </Table> 
    </GetReferenceTableResult>
</GetReferenceTableResponse>

【问题讨论】:

  • 错误是什么?请编辑您的问题,提供更多详细信息,并最好在 using 语句中提供所有代码 (using (XmlReader reader)
  • 使用XmlReader解析xml文档效率非常低。您是否考虑使用XDocumentXPath?只需几行代码;还是你必须坚持XmlReader
  • @kennyzx - “低效”是一个有趣的术语,表示使用网络中的类解析 XML 的最快方式。比 XDocument/XmlDocument 更难正确 - 确实...
  • @AlexeiLevenkov 好,可以帮助我选择单词,也许是冗长的?当我输入高效时,我的意思是“使用更少的代码”,而不是“最高性能”。
  • 您对性能的考虑是什么? @Alexei 是正确的,XMLReader 是更好的性能选择。但如果不是这种情况,您可以使用 LINQ。更容易和可读的结构。

标签: c# xml xmlreader


【解决方案1】:

ReadToFollowing 导航到具有给定名称的最近元素,下一个 Read 将进入该元素 - 直接到文本。所以在这两种情况下你都需要ReadContentAsString

在你的情况下会起作用:

using (XmlReader reader = XmlReader.Create(new StringReader(strxml)))
{
    while (reader.Read())
    {
        if (reader.IsStartElement())
        {
            switch (reader.Name)
            {
                case "Row":                     
                    if (!Flag)
                    {
                        reader.ReadToFollowing("TERM-ID");
                        reader.Read();
                        string strTERMID = reader.ReadContentAsString();                         
                        if (strTERMID == strTerminalId && reader.ReadToNextSibling("USER-ID"))
                        {
                            reader.Read();
                            strUserName = reader.ReadContentAsString();
                            Flag = true;
                        }
                    }
                    break;
            }
        }
    }
}

我在 case "Row": 之后删除了第一个 Read - 否则你会错过正确的元素,并且从 while 循环中删除 ReadToFollowing("USER-ID") - 只进入元素一次是好的。

但正如@kennyzx 所说 - 使用 XDoccument 解析 xml 要简单得多。

更新 我不确定您的架构,但如果 R​​ow 元素可能没有用户 ID,那么使用 ReadToFollowing 可以跳到下一个可用的“用户 ID”元素,即使它不在相同的“行”元素。所以第二种情况最好使用ReadToNextSibling

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-21
    • 1970-01-01
    • 2012-09-11
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 2012-08-27
    • 1970-01-01
    相关资源
    最近更新 更多