/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
  <?firstPi customKey="something"?>
  firstPi
  customKey="something"
  <?secondPi secondPiData?>
  secondPi
  secondPiData
2
p
 customKey="something"

<ns1:e11 xmlns:ns1="http://www.foo.com/ns1/">text1</ns1:e11><ns1:e11 xmlns:ns1="http://www.foo.com/ns1/">text2</ns1:e11>
<ns1:e12 xmlns:ns1="http://www.foo.com/ns1/"><![CDATA[cdata-section1]]></ns1:e12><ns1:e12 xmlns:ns1="http://www.foo.com/ns1/"><![CDATA[cdata-section2<&]]></ns1:e12>
<ns1:e1 xmlns:ns1="http://www.foo.com/ns1/" a1="v1" a2="v2">
    <ns1:e11>text1</ns1:e11>
    <ns1:e12><![CDATA[cdata-section1]]></ns1:e12>
  </ns1:e1>
<ns1:e11 xmlns:ns1="http://www.foo.com/ns1/">text1</ns1:e11><ns1:e11 xmlns:ns1="http://www.foo.com/ns1/">text2</ns1:e11>
a1
v2
rootroot
root
  root
  e1
  e11
  e12
  e2
  e11
  e12
  root
  root
  e1
  root
  e1
  e11
  root
  e1
  e12
  root
  e2
  root
  e2
  e11
  root
  e2
  e12
cdata-section2&lt;&amp;
cdata-section2<&
