留言板

Very Simple XML parsing question

thumbnail
Clint Wilde,修改在8 年前。

Very Simple XML parsing question

Junior Member 帖子: 39 加入日期: 13-3-5 最近的帖子
Hi Folks,

This code is driving me crazy. It looks fine but why is it not printing each node's title?

I just want to parse this XML and get the right values for each 'pointEnabled' node:

XML:

<root available-locales="en_US" default-locale="en_US">
        <dynamic-element name="pointEnabled" type="boolean" index-type="keyword" index="0">
                <dynamic-element name="title" index="0" type="text" index-type="keyword">
                        <dynamic-content language-id="en_US">title One</dynamic-content>
                </dynamic-element>
                <dynamic-element name="x" index="0" type="ddm-number" index-type="keyword">
                        <dynamic-content language-id="en_US">70</dynamic-content>
                </dynamic-element>
                <dynamic-content language-id="en_US">true</dynamic-content>
        </dynamic-element>
        <dynamic-element name="pointEnabled" type="boolean" index-type="keyword" index="1">
                <dynamic-element name="title" index="1" type="text" index-type="keyword">
                        <dynamic-content language-id="en_US">title Two</dynamic-content>
                </dynamic-element>
                <dynamic-element name="x" index="1" type="ddm-number" index-type="keyword">
                        <dynamic-content language-id="en_US">300</dynamic-content>
                </dynamic-element>
                <dynamic-content language-id="en_US">true</dynamic-content>
        </dynamic-element>
</root>


Java Parsing Code:
private static void parseXML() throws DocumentException, IOException
	{	
		Document doc = SAXReaderUtil.read(new FileInputStream("C:/Users/cwilde/Desktop/im2.xml"));
		System.out.println("doc: " + doc.formattedString());
		Node root = doc.getRootElement();
		List<node> pointNodes = root.selectNodes("/root/dynamic-element[@name='pointEnabled']");
	
		System.out.println("Node Count: " + pointNodes.size());
		
		for (int i = 0; i &lt; pointNodes.size(); i++) 
		{	
			Node pointNode = pointNodes.get(i);
			System.out.println("pointNodes.get("+i+"): "+ pointNode.formattedString());
			
			Node titleNode = pointNode.selectSingleNode("//dynamic-element[@name='title']/dynamic-content[@language-id='en_US']");
			
			System.out.println();
			System.out.println("---------------------");
			System.out.println("		titleNode.getText(): "+ titleNode.getText());// WHY IS THIS ALWAYS GETTING title1? 
			System.out.println("---------------------");
		}
	}
</node>


Output:

Node Count: 2
pointNodes.get(0):
<dynamic-element name="pointEnabled" type="boolean" index-type="keyword" index="0">
<dynamic-element name="title" index="0" type="text" index-type="keyword">
<dynamic-content language-id="en_US"><![CDATA[title One]]></dynamic-content>
</dynamic-element>
<dynamic-element name="x" index="0" type="ddm-number" index-type="keyword">
<dynamic-content language-id="en_US"><![CDATA[70]]></dynamic-content>
</dynamic-element>
<dynamic-content language-id="en_US"><![CDATA[true]]></dynamic-content>
</dynamic-element>

---------------------
titleNode.getText(): title One
---------------------
pointNodes.get(1):
<dynamic-element name="pointEnabled" type="boolean" index-type="keyword" index="1">
<dynamic-element name="title" index="1" type="text" index-type="keyword">
<dynamic-content language-id="en_US"><![CDATA[title Two]]></dynamic-content>
</dynamic-element>
<dynamic-element name="x" index="1" type="ddm-number" index-type="keyword">
<dynamic-content language-id="en_US"><![CDATA[300]]></dynamic-content>
</dynamic-element>
<dynamic-content language-id="en_US"><![CDATA[true]]></dynamic-content>
</dynamic-element>

---------------------
titleNode.getText(): title One
---------------------

I am expecting it to print "Title Two" during the 2nd loop, but it always prints "Title One"...

Any help is MUCH appreciated !!!
Thanks in advance...
thumbnail
Bijan Vakili,修改在8 年前。

RE: Very Simple XML parsing question

Expert 帖子: 375 加入日期: 09-3-10 最近的帖子
I tried your code with org.dom4j.io.SAXReader instead of com.liferay.portal.kernel.xml.SAXReaderUtil and it worked.


doc: 
        
                
                        title One
                
                
                        70
                
                true
        
        
                
                        title Two
                
                
                        300
                
                true


Can you try following and let us know:
	SAXReader saxReader = new SAXReader();
        Document doc = saxReader.read(new FileInputStream("/home/mali2/Downloads/im2.xml"));
thumbnail
Rajeev Nair,修改在8 年前。

RE: Very Simple XML parsing question

New Member 帖子: 15 加入日期: 13-3-5 最近的帖子
Clint Wilde:
Hi Folks,

This code is driving me crazy. It looks fine but why is it not printing each node's title?

I just want to parse this XML and get the right values for each 'pointEnabled' node:

XML:

<root available-locales="en_US" default-locale="en_US">
        <dynamic-element name="pointEnabled" type="boolean" index-type="keyword" index="0">
                <dynamic-element name="title" index="0" type="text" index-type="keyword">
                        <dynamic-content language-id="en_US">title One</dynamic-content>
                </dynamic-element>
                <dynamic-element name="x" index="0" type="ddm-number" index-type="keyword">
                        <dynamic-content language-id="en_US">70</dynamic-content>
                </dynamic-element>
                <dynamic-content language-id="en_US">true</dynamic-content>
        </dynamic-element>
        <dynamic-element name="pointEnabled" type="boolean" index-type="keyword" index="1">
                <dynamic-element name="title" index="1" type="text" index-type="keyword">
                        <dynamic-content language-id="en_US">title Two</dynamic-content>
                </dynamic-element>
                <dynamic-element name="x" index="1" type="ddm-number" index-type="keyword">
                        <dynamic-content language-id="en_US">300</dynamic-content>
                </dynamic-element>
                <dynamic-content language-id="en_US">true</dynamic-content>
        </dynamic-element>
</root>


Java Parsing Code:
private static void parseXML() throws DocumentException, IOException
	{	
		Document doc = SAXReaderUtil.read(new FileInputStream("C:/Users/cwilde/Desktop/im2.xml"));
		System.out.println("doc: " + doc.formattedString());
		Node root = doc.getRootElement();
		List<node> pointNodes = root.selectNodes("/root/dynamic-element[@name='pointEnabled']");
	
		System.out.println("Node Count: " + pointNodes.size());
		
		for (int i = 0; i &lt; pointNodes.size(); i++) 
		{	
			Node pointNode = pointNodes.get(i);
			System.out.println("pointNodes.get("+i+"): "+ pointNode.formattedString());
			
			Node titleNode = pointNode.selectSingleNode("//dynamic-element[@name='title']/dynamic-content[@language-id='en_US']");
			
			System.out.println();
			System.out.println("---------------------");
			System.out.println("		titleNode.getText(): "+ titleNode.getText());// WHY IS THIS ALWAYS GETTING title1? 
			System.out.println("---------------------");
		}
	}
</node>


Output:

Node Count: 2
pointNodes.get(0):
<dynamic-element name="pointEnabled" type="boolean" index-type="keyword" index="0">
<dynamic-element name="title" index="0" type="text" index-type="keyword">
<dynamic-content language-id="en_US"><![CDATA[title One]]></dynamic-content>
</dynamic-element>
<dynamic-element name="x" index="0" type="ddm-number" index-type="keyword">
<dynamic-content language-id="en_US"><![CDATA[70]]></dynamic-content>
</dynamic-element>
<dynamic-content language-id="en_US"><![CDATA[true]]></dynamic-content>
</dynamic-element>

---------------------
titleNode.getText(): title One
---------------------
pointNodes.get(1):
<dynamic-element name="pointEnabled" type="boolean" index-type="keyword" index="1">
<dynamic-element name="title" index="1" type="text" index-type="keyword">
<dynamic-content language-id="en_US"><![CDATA[title Two]]></dynamic-content>
</dynamic-element>
<dynamic-element name="x" index="1" type="ddm-number" index-type="keyword">
<dynamic-content language-id="en_US"><![CDATA[300]]></dynamic-content>
</dynamic-element>
<dynamic-content language-id="en_US"><![CDATA[true]]></dynamic-content>
</dynamic-element>

---------------------
titleNode.getText(): title One
---------------------

I am expecting it to print "Title Two" during the 2nd loop, but it always prints "Title One"...

Any help is MUCH appreciated !!!
Thanks in advance...


Hi Clint,

In the Java Parsing Code, inside the for loop:
Instead of getting the title node as:
Node titleNode = pointNode.selectSingleNode("//dynamic-element[@name='title']/dynamic-content[@language-id='en_US']");

try to get the title node as:

Node titleNode = pointNode.selectSingleNode("dynamic-element[@name='title']/dynamic-content[@language-id='en_US']");

This is because '//' syntax in XPath selects the first node of the document with the given expression.

Refer to : XmlNode.SelectSingleNode
thumbnail
Satish Babu Anupoju,修改在6 年前。

RE: Very Simple XML parsing question

Junior Member 帖子: 79 加入日期: 11-2-20 最近的帖子
Hi Rajeev Nair
good tip. Helps a lot. Thank you !

Regards
Satsih Babu