rafaelrgl
asked on
how to read data from xml
hi experts, i have this xml below:
now, i can't change the xml, so i want to populate an listview with the category and subcategory. how can i do that
<response type="categories_listing" generation_date_gmt="Tue, 18 Jun 2013 10:26:28 GMT">
<url>
http://localhost/sml.xml
</url>
<categories site="test">
<category id="1368" adult="N" name="Arte e Artesanato">
<category id="5460" adult="N" name="Artesanato"></category>
<category id="2662" adult="N" name="Esculturas"></category>
<category id="40285" adult="N" name="Ferramentas e Materiais"></category>
<category id="1370" adult="N" name="Gravuras"></category>
<category id="5464" adult="N" name="Livros"></category>
<category id="1369" adult="N" name="Pinturas"></category>
<category id="1371" adult="N" name="Outros"></category>
</category>
<category id="1051" adult="N" name="Celulares e Telefones">
<category id="3813" adult="N" name="Acessórios para Celulares"></category>
<category id="7475" adult="N" name="Cartões de Memória"></category>
<category id="1055" adult="N" name="Celulares"></category>
<category id="5427" adult="N" name="Nextel"></category>
<category id="1058" adult="N" name="Rádio Amador"></category>
<category id="46195" adult="N" name="Telefones"></category>
<category id="7502" adult="N" name="VoIP"></category>
<category id="2908" adult="N" name="Walkie - Talkies"></category>
<category id="1915" adult="N" name="Outros"></category>
</category>
</response>
now, i can't change the xml, so i want to populate an listview with the category and subcategory. how can i do that
where's the subcategory?
ASKER
well, this
<category id="1368" adult="N" name="Arte e Artesanato">
<category id="5460" adult="N" name="Artesanato"></catego ry>
<category id="2662" adult="N" name="Esculturas"></catego ry>
<category id="40285" adult="N" name="Ferramentas e Materiais"></category>
<category id="1370" adult="N" name="Gravuras"></category >
<category id="5464" adult="N" name="Livros"></category>
<category id="1369" adult="N" name="Pinturas"></category >
<category id="1371" adult="N" name="Outros"></category>
</category>
i formated above so you can see there is category id="1368" and the others inside are subcategorys.
<category id="1368" adult="N" name="Arte e Artesanato">
<category id="5460" adult="N" name="Artesanato"></catego
<category id="2662" adult="N" name="Esculturas"></catego
<category id="40285" adult="N" name="Ferramentas e Materiais"></category>
<category id="1370" adult="N" name="Gravuras"></category
<category id="5464" adult="N" name="Livros"></category>
<category id="1369" adult="N" name="Pinturas"></category
<category id="1371" adult="N" name="Outros"></category>
</category>
i formated above so you can see there is category id="1368" and the others inside are subcategorys.
since xml contains hierarchy using tree-view control is better approach.
how would u like to display this kind of structure in listview?
how would u like to display this kind of structure in listview?
Hi rafaelrgl;
The following code uses Linq to XML to query the document and build your ListView control.
The following code uses Linq to XML to query the document and build your ListView control.
using System.Xml.Linq;
// Load the XML file from the file system. Change path to the file below
XDocument doc = XDocument.Load("C:/Working Directory/Response.xml");
// Get a reference to the categories node
XElement categoriesElements = doc.Root.Element("categories");
// Query the document for the needed info.
var results = (from d in categoriesElements.Elements("category")
select new
{
Parent = d.Attribute("name").Value,
Children = (from c in d.Elements("category")
select c.Attribute("name").Value).ToList()
}).ToList();
// Build your list view items
foreach (var node in results)
{
// New parent node
var lItem = new ListViewItem(node.Parent);
foreach (var child in node.Children)
{
// Add all children nodes
lItem.SubItems.Add(child);
}
// Attach parent node to the list view control
listView1.Items.Add(lItem);
}
ASKER
i mean tree-view, sorry sedgwick. how this can be accomplish
@FernandoSoto
what did u set to the View property of the listview?
there's no correlation between the parent categories and the child categories when u display them in listview in this matter.
what did u set to the View property of the listview?
there's no correlation between the parent categories and the child categories when u display them in listview in this matter.
here in treeview:
private void populateTreeview()
{
WebRequest req = WebRequest.Create("http://www.mercadolivre.com.br/jm/categsXml?as_site_id=MLB&as_max_level=2");
WebResponse resp = req.GetResponse();
StreamReader textReader = new StreamReader(resp.GetResponseStream());
XmlTextReader xmlReader = new XmlTextReader(textReader);
xmlReader.XmlResolver = null;
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.XmlResolver = null;
xmlDoc.Load(xmlReader);
treeView1.Nodes.Clear();
treeView1.Nodes.Add(new TreeNode(xmlDoc.DocumentElement.Name));
TreeNode tNode = new TreeNode();
tNode = (TreeNode)treeView1.Nodes[0];
addTreeNode(xmlDoc.DocumentElement, tNode);
treeView1.ExpandAll();
}
//This function is called recursively until all nodes are loaded
private void addTreeNode(XmlNode xmlNode, TreeNode treeNode)
{
XmlNode xNode;
TreeNode tNode;
XmlNodeList xNodeList;
if (xmlNode.HasChildNodes) //The current node has children
{
xNodeList = xmlNode.ChildNodes;
for (int x = 0; x <= xNodeList.Count - 1; x++)
//Loop through the child nodes
{
xNode = xmlNode.ChildNodes[x];
treeNode.Nodes.Add(new TreeNode(xNode.Name));
tNode = treeNode.Nodes[x];
addTreeNode(xNode, tNode);
}
}
else //No children, so add the outer xml (trimming off whitespace)
treeNode.Text = xmlNode.OuterXml.Trim();
}
ASKER
sedgwick, did this code worked for you, did you tested, because for me did not worked. i does not show the content right.
Imports System.Net
Imports System.Xml
Imports System.IO
Partial Class WebUserControl_CategoriasVertical
Inherits System.Web.UI.UserControl
Protected Sub Page_Init(sender As Object, e As System.EventArgs) Handles Me.Init
populateTreeview()
End Sub
Private Sub populateTreeview()
Dim req As WebRequest = WebRequest.Create("http://www.mercadolivre.com.br/jm/categsXml?as_site_id=MLB&as_max_level=2")
Dim resp As WebResponse = req.GetResponse()
Dim textReader As New StreamReader(resp.GetResponseStream())
Dim xmlReader As New XmlTextReader(textReader)
xmlReader.XmlResolver = Nothing
Dim xmlDoc As New XmlDocument()
xmlDoc.XmlResolver = Nothing
xmlDoc.Load(xmlReader)
TreeView1.Nodes.Clear()
TreeView1.Nodes.Add(New TreeNode(xmlDoc.DocumentElement.Name))
Dim tNode As New TreeNode()
tNode = DirectCast(TreeView1.Nodes(0), TreeNode)
addTreeNode(xmlDoc.DocumentElement, tNode)
TreeView1.ExpandAll()
End Sub
'This function is called recursively until all nodes are loaded
Private Sub addTreeNode(xmlNode As XmlNode, treeNode As TreeNode)
Dim xNode As XmlNode
Dim tNode As TreeNode
Dim xNodeList As XmlNodeList
If xmlNode.HasChildNodes Then
'The current node has children
xNodeList = xmlNode.ChildNodes
For x As Integer = 0 To xNodeList.Count - 1
'Loop through the child nodes
xNode = xmlNode.ChildNodes(x)
treeNode.ChildNodes.Add(New TreeNode(xNode.Name))
tNode = treeNode.ChildNodes(x)
addTreeNode(xNode, tNode)
Next
Else
'No children, so add the outer xml (trimming off whitespace)
treeNode.Text = xmlNode.OuterXml.Trim()
End If
End Sub
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
i see, you are using the win32 version, i want for asp.net webforms, and i don't want to show the xml file, but the category like this:
Arte e Artesanato
Artesanato
Esculturas
Ferramentas e Materiais
Gravuras
and i want to be able to have this as an link, so i can build some propertys like put the id on the link, so on.
Arte e Artesanato
Artesanato
Esculturas
Ferramentas e Materiais
Gravuras
and i want to be able to have this as an link, so i can build some propertys like put the id on the link, so on.
ASKER
hi fernando, i am not use to Linq.
So how do i make this sample to work on asp.net using vb.net
So how do i make this sample to work on asp.net using vb.net