XmlReader:不读取同级子元素
XmlReader: Not reading sibling child elements
代码如下:
string str = "<A><B>Apple</B><B>Mango</B></A>";
using (XmlReader xmlReader = XmlReader.Create(new StringReader(str)))
{
while (xmlReader.Read())
{
if (xmlReader.NodeType == XmlNodeType.Element && xmlReader.Name == "B")
{
Console.WriteLine(xmlReader.ReadElementContentAsString());
}
}
}
输出:
苹果
假设输出:
苹果
芒格洛
你能帮我理解这段代码有什么问题吗?我如何获得预期的输出?
注意:我想用 XmlReader 实现这个
ReadElementContentAsString
读取 reader 并将其前进到下一个元素。
因此,对于 while
中的 Read
,您将跳过下一个 B
元素。
而是使用 Value
属性.
using (XmlReader xmlReader = XmlReader.Create(new StringReader(str)))
{
while (xmlReader.Read())
{
if (xmlReader.NodeType == XmlNodeType.Element && xmlReader.Name == "B")
{
xmlReader.Read(); // Next read will contain the value
Console.WriteLine(xmlReader.Value);
}
}
}
如果你想显示外层 xml 则使用方式稍有不同:
bool hasMore = xmlReader.Read();
while (hasMore)
{
if (xmlReader.NodeType == XmlNodeType.Element && xmlReader.Name == "B")
{
Console.WriteLine(xmlReader.ReadOuterXml());
}
else hasMore = xmlReader.Read();
}
如果有人想知道如何获取每个子节点的 OuterXml 以及如何使用子节点值,可以使用以下代码:
string str = "<A><B>Apple</B><B>Mango</B></A>";
using (XmlReader xmlReader = XmlReader.Create(new StringReader(str)))
{
while (!xmlReader.EOF)
{
if (xmlReader.NodeType == XmlNodeType.Element && xmlReader.Name == "B")
{
XElement xElement = XNode.ReadFrom(xmlReader) as XElement;
Console.WriteLine(xElement.ToString()); // This will print the tag
Console.WriteLine(xElement.Value); // This will print the tag value
}
else
{
xmlReader.Read();
}
}
}
代码如下:
string str = "<A><B>Apple</B><B>Mango</B></A>";
using (XmlReader xmlReader = XmlReader.Create(new StringReader(str)))
{
while (xmlReader.Read())
{
if (xmlReader.NodeType == XmlNodeType.Element && xmlReader.Name == "B")
{
Console.WriteLine(xmlReader.ReadElementContentAsString());
}
}
}
输出:
苹果
假设输出:
苹果
芒格洛
你能帮我理解这段代码有什么问题吗?我如何获得预期的输出?
注意:我想用 XmlReader 实现这个
ReadElementContentAsString
读取 reader 并将其前进到下一个元素。
因此,对于 while
中的 Read
,您将跳过下一个 B
元素。
而是使用 Value
属性.
using (XmlReader xmlReader = XmlReader.Create(new StringReader(str)))
{
while (xmlReader.Read())
{
if (xmlReader.NodeType == XmlNodeType.Element && xmlReader.Name == "B")
{
xmlReader.Read(); // Next read will contain the value
Console.WriteLine(xmlReader.Value);
}
}
}
如果你想显示外层 xml 则使用方式稍有不同:
bool hasMore = xmlReader.Read();
while (hasMore)
{
if (xmlReader.NodeType == XmlNodeType.Element && xmlReader.Name == "B")
{
Console.WriteLine(xmlReader.ReadOuterXml());
}
else hasMore = xmlReader.Read();
}
如果有人想知道如何获取每个子节点的 OuterXml 以及如何使用子节点值,可以使用以下代码:
string str = "<A><B>Apple</B><B>Mango</B></A>";
using (XmlReader xmlReader = XmlReader.Create(new StringReader(str)))
{
while (!xmlReader.EOF)
{
if (xmlReader.NodeType == XmlNodeType.Element && xmlReader.Name == "B")
{
XElement xElement = XNode.ReadFrom(xmlReader) as XElement;
Console.WriteLine(xElement.ToString()); // This will print the tag
Console.WriteLine(xElement.Value); // This will print the tag value
}
else
{
xmlReader.Read();
}
}
}