我将以下元素作为 XML 文档的一部分:
<RegisterEntry>
<EntryNumber>3</EntryNumber>
<EntryDate>2009-01-30</EntryDate>
<EntryType>Registered Charges</EntryType>
<EntryText>REGISTERED CHARGE dated 30 December 2008.</EntryText>
</RegisterEntry>
<RegisterEntry>
<EntryNumber>4</EntryNumber>
<EntryType>Registered Charges</EntryType>
<EntryText>REGISTERED CHARGE dated 30 December 2008.</EntryText>
</RegisterEntry>
我正在使用 XmlReader 循环访问文档。 RegisterEntry 是一个 XMLNodeType.Element,此元素中包含的四个是 XmlNodeType.Text。当 XmlReader 在 NodeType.Text 上为 Node.Name 返回一个空字符串时,我如何将这些文本值中的每一个分配给不同的变量。此外,重复的元素并不总是具有相同数量的文本元素。代码如下:
XmlTextReader reader = new XmlTextReader(fName);
if(reader.NodeType == XmlNodeType.Element && reader.Name =="RegisterEntry")
{
propEntryNo = "";
propEntryDate = "";
propEntryType = "";
propEntryText = "";
while(reader.Read())
{
if(reader.NodeType == XmlNodeType.Text && reader.Name == "EntryNumber" && reader.HasValue)
{
propEntryNo = reader.Value;
}
if (reader.NodeType == XmlNodeType.Text && reader.Name == "EntryDate" && reader.HasValue)
{
propEntryDate = reader.Value;
}
if (reader.NodeType == XmlNodeType.Text && reader.Name == "EntryType" && reader.HasValue)
{
propEntryType = reader.Value;
}
if (reader.NodeType == XmlNodeType.Text && reader.Name == "EntryText" && reader.HasValue)
{
propEntryText += reader.Value + ",";
}
if(reader.NodeType == XmlNodeType.EndElement && reader.Name == "RegisterEntry")
{
add variable values to list
break;
}
}
}
在上面的每个 if 语句中,NodeType 作为 Text 返回,而 Name 作为空字符串返回。
最佳答案
XML 元素和里面的文本是不同节点!
您必须先阅读 XML 元素的内容。 简单示例:
switch (reader.Name)
{
// found a node with name = "EntryNumber" (type = Element)
case "EntryNumber":
// make sure it's not the closing tag
if (reader.IsStartElement())
{
// read the text inside the element, which is a seperate node (type = Text)
reader.Read();
// get the value of the text node
propEntryNo = reader.Value;
}
break;
// ...
}
另一个选项是 ReadElementContentAsString
switch (reader.Name)
{
case "EntryNumber":
propEntryNo = reader.ReadElementContentAsString();
break;
// ...
}
当然,这些简单示例假定 XML 为预期格式。您应该在代码中包含适当的检查。
至于其他建议的解决方案:
你可以 XmlDocument或 XDocument或者相反。处理更容易,但 memory overhead is bigger (see also)。
Deserializing将 XML 转化为对象是另一种选择。但我觉得处理由意外格式引起的错误会比较棘手。
关于c# - 具有多个不同文本元素的 XML 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52986992/