2011-10-31 114 views
0

我想从xml文件中动态读取xml元素(我的意思是没有硬编码元素名称)。我无法使用XmlReader.ReadToDescendant方法,因为它需要一个本地名称,在我的情况下,这个名称会有所不同。例如,在这种情况下,我需要阅读元素A,B,C,d &等等使用c#读取xml文件中的动态元素`

<?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

你去哪儿得到的名字读,然后?从另一个文件或数据库? –

+0

@MarkW:仅限于xml文件。 – user972255

回答

5

这是相当简单:

XDocument doc = XDocument.Load("test.xml"); 
string name = GetNameFromWherever(); 
foreach (XElement match in doc.Descendants(name)) 
{ 
    ... 
} 

这是使用LINQ to XML - 一个可爱的API为XML如果你使用.NET 3.5或更高版本......这比使用XmlReader更好

+0

感谢您的回复。如果我不知道元素,有什么办法可以从XmlDocument动态获取数据吗? – user972255

+0

@ user972255:目前还不清楚你的意思 - 这是基于可以在执行时获取的名字来获取元素,例如,通过询问用户。 –

+0

好的。如果你有多个名字,那么我们需要在子孙循环之上有另一个循环来逐个获取名字? – user972255

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);