使用 XML 解析器读取 XML
本文关键字:XML 读取 使用 | 更新日期: 2023-09-27 18:31:53
我需要获取用户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>
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 要简单得多。
更新我不确定您的架构,但如果 Row 元素可能没有 User-Id,那么使用 ReadToFollowing
可以跳到下一个可用的"User-ID"元素,即使它不在同一个"Row"元素中。因此,最好在第二种情况下使用ReadToNextSibling
。