XML Error: There are multiple root elements

前端 未结 4 1072
悲哀的现实
悲哀的现实 2020-11-27 19:26

I am getting XML from a web service. Here is what the XML looks like:


    
        Text
    

相关标签:
4条回答
  • 2020-11-27 19:48

    If you're in charge (or have any control over the web service), get them to add a unique root element!

    If you can't change that at all, then you can do a bit of regex or string-splitting to parse each and pass each element to your XML Reader.

    Alternatively, you could manually add a junk root element, by prefixing an opening tag and suffixing a closing tag.

    0 讨论(0)
  • 2020-11-27 19:50

    Wrap the xml in another element

    <wrapper>
    <parent>
        <child>
            Text
        </child>
    </parent>
    <parent>
        <child>
            <grandchild>
                Text
            </grandchild>
            <grandchild>
                Text
            </grandchild>
        </child>
        <child>
            Text
        </child>
    </parent>
    </wrapper>
    
    0 讨论(0)
  • 2020-11-27 19:55

    You need to enclose your <parent> elements in a surrounding element as XML Documents can have only one root node:

    <parents> <!-- I've added this tag -->
        <parent>
            <child>
                Text
            </child>
        </parent>
        <parent>
            <child>
                <grandchild>
                    Text
                </grandchild>
                <grandchild>
                    Text
                </grandchild>
            </child>
            <child>
                Text
            </child>
        </parent>
    </parents> <!-- I've added this tag -->
    

    As you're receiving this markup from somewhere else, rather than generating it yourself, you may have to do this yourself by treating the response as a string and wrapping it with appropriate tags, prior to attempting to parse it as XML.

    So, you've a couple of choices:

    1. Get the provider of the web service to return you actual XML that has one root node
    2. Pre-process the XML, as I've suggested above, to add a root node
    3. Pre-process the XML to split it into multiple chunks (i.e. one for each <parent> node) and process each as a distinct XML Document
    0 讨论(0)
  • 2020-11-27 20:11

    You can do it without modifying the XML stream: Tell the XmlReader to not be so picky. Setting the XmlReaderSettings.ConformanceLevel to ConformanceLevel.Fragment will let the parser ignore the fact that there is no root node.

            XmlReaderSettings settings = new XmlReaderSettings();
            settings.ConformanceLevel = ConformanceLevel.Fragment;
            using (XmlReader reader = XmlReader.Create(tr,settings))
            {
                 ...
            }
    

    Now you can parse something like this (which is an real time XML stream, where it is impossible to wrap with a node).

    <event>
      <timeStamp>1354902435238</timeStamp>
      <eventId>7073822</eventId>
    </event>
    <data>
      <time>1354902435341</time>
      <payload type='80'>7d1300786a0000000bf9458b0518000000000000000000000000000000000c0c030306001b</payload>
    </data>
    <data>
      <time>1354902435345</time>
      <payload type='80'>fd1260780912ff3028fea5ffc0387d640fa550f40fbdf7afffe001fff8200fff00f0bf0e000042201421100224ff40312300111400004f000000e0c0fbd1e0000f10e0fccc2ff0000f0fe00f00f0eed00f11e10d010021420401</payload>
    </data>
    <data>
      <time>1354902435347</time>
      <payload type='80'>fd126078ad11fc4015fefdf5b042ff1010223500000000000000003007ff00f20e0f01000e0000dc0f01000f000000000000004f000000f104ff001000210f000013010000c6da000000680ffa807800200000000d00c0f0</payload>
    </data>
    
    0 讨论(0)
提交回复
热议问题