我想从xml文件中动态读取xml元素(我的意思是不对元素名称进行硬编码)。我无法使用XmlReader.ReadToDescendant方法,因为它需要一个本地名称,在我的情况下会有所不同。例如,在这种情况下,我需要读取元素A,B,C,D&等...
<?xml version="1.0" encoding="UTF-8"?>
<test Version="2010" xmlns="http://test.org/2010/values">
<A>
<Data>
<Somedata></Somedata>
</Data>
<Rows>
<Row></Row>
<Row></Row>
</Rows>
</A>
<B>
<Data>
<Somedata></Somedata>
</Data>
<Rows>
<Row></Row>
<Row></Row>
</Rows>
</B>
<C>
<Data>
<Somedata></Somedata>
</Data>
<Rows>
<Row></Row>
<Row></Row>
</Rows>
</C>
<D>
<Data>
<Somedata></Somedata>
</Data>
<Rows>
<Row></Row>
<Row></Row>
</Rows>
</D>
</test>
请帮帮我。
答案 0 :(得分:5)
这很简单:
XDocument doc = XDocument.Load("test.xml");
string name = GetNameFromWherever();
foreach (XElement match in doc.Descendants(name))
{
...
}
使用LINQ to XML - 如果您使用的是.NET 3.5或更高版本,那么这是一个可爱的XML API ...它比使用XmlReader
更好 。
答案 1 :(得分:0)
为了将XML内容动态生成到另一组类中,您可以执行以下操作:
class GenericNode
{
private List<GenericNode> _Nodes = new List<GenericNode>();
private List<GenericKeyValue> _Attributes = new List<GenericKeyValue>();
public GenericNode(XElement Element)
{
this.Name = Element.Name;
this._Nodes.AddRange(Element.Elements()
.Select(e => New GenericNode(e));
this._Attributes.AddRange(
Element.Attributes()
.Select(a => New GenericKeyValue(a.Key, a.Value))
}
public string Name { get; private set; }
public IEnumerable<GenericNode> Nodes
{
get
{
return this._Nodes;
}
}
public IEnumerable<GenericKeyValue> Attributes
{
get
{
return this._Attributes;
}
}
}
class GenericKeyValue
{
public GenericKeyValue(string Key, string Value)
{
this.Key = Key;
this.Value = Value;
}
public string Key { get; set; }
public string Value { get; set; }
}
然后你只需:
XElement rootElement = XElement.Parse(StringOfXml); // or
XElement rootElement = XElement.Load(FileOfXml);
GenericNode rootNode = new GenericRode(rootElement);