Java - извлечение документов XML из строки - PullRequest
0 голосов
/ 01 марта 2011

Имея случайную строку, как извлечь из нее XML-документ (ы)?

Учтите, что строка может содержать ни один (неполный), один (полный) или несколько документов.

Существует ли шаблон / инструмент для решения этой проблемы?

LE: рассмотрим случай, когда данные XML извлекаются через TCP / IP

Ответы [ 3 ]

2 голосов
/ 01 марта 2011

Несколько документов - это проблема ... Я бы обернул строку в дополнительный "корень", это по крайней мере преобразовало бы содержимое в действительный XML-документ:

 String xml = "<my-own-root-element>" + getString() + "</my-own-root-element>";

Просто начало. Конечно, забудьте о XML-схемах и типе документа. Различные кодировки символов могут быть проблемой, и вам, возможно, придется отфильтровать <?xml ... ?> инструкции по обработке.

1 голос
/ 01 марта 2011

Я не знаю ни одного существующего решения, которое могло бы автоматически обрабатывать поврежденные XML-документы. XML - это очень строгий стандарт с небольшим запасом свободы при разборе ошибок. Вы по своему усмотрению.

Что вы можете попробовать, так это посмотреть на код для редакторов XML; они должны иметь возможность обрабатывать поврежденные документы, но я сомневаюсь, что любой из них может обрабатывать такие вещи, как отсутствующие элементы запуска и тому подобное.

0 голосов
/ 17 ноября 2013

это моя версия на C #, надеюсь, она дает какое-то направление ... Я использую его для связи по tcp / ip, а T обозначает какой-то универсальный тип.

public List<T> ParseMultipleDocumentsByType<T>(string documents)
    {
        var cleanParsedDocuments = new List<T>();
        var stringContainsDocuments = true;
        while (stringContainsDocuments )
        {
            if(documents.Contains(typeof(T).Name))
            {
                var startingPoint = documents.IndexOf("<?xml");
                var endingString = "</" +typeof(T).Name + ">";
                var endingPoing = documents.IndexOf(endingString) + endingString.Length;
                var document = documents.Substring(startingPoint, endingPoing - startingPoint);
                var singleDoc = (T)XmlDeserializeFromString(document, typeof(T));
                cleanParsedDocuments.Add(singleDoc);
                documents = documents.Remove(startingPoint, endingPoing - startingPoint);
            }
            else
            {
                flag = false;
            }
        }


        return cleanParsedDocuments;
    }

    public static object XmlDeserializeFromString(string objectData, Type type)
    {
        var serializer = new XmlSerializer(type);
        object result;

        using (TextReader reader = new StringReader(objectData))
        {
            result = serializer.Deserialize(reader);
        }

        return result;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...