Используя Google Guava , вы можете использовать Splitter.fixedLength ()
Возвращает разделитель, который делит строки на куски заданной длины
Splitter.fixedLength(2).split("abcde");
// returns an iterable containing ["ab", "cd", "e"].
Ну, во-первых, ваш XSD определяет пространство имен XML xmlns = "urn: bookstore-schema"
, которого нет в вашем тестовом файле XML - следовательно, ничего в ваш тестовый XML-файл будет проверен.
Если вы удалите эти элементы из своей схемы:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="title" type="xsd:string" />
, он правильно проверит ваш тестовый XML-файл и пожалуется на неправильные элементы.
Также использование элемента с именем
может быть не очень удачной идеей, поскольку директива Xml ......?>
является предварительно определенной директивой и не должно появляться как имя тега где-либо еще в вашем документе.
Marc
Вы также можете попробовать XmlValidatingReader для проверки XML
Я не хочу, чтобы пользователь отправлял XML, который не определен в XSD.
Почему вас это волнует? Ваша схема проверяет узлы XML, которые находятся в вашем пространстве имен. Ваша логика обработки обрабатывает узлы XML, которые находятся в вашем пространстве имен. Узлы, не входящие в ваше пространство имен, не имеют отношения ни к вашей схеме, ни к вашей логике.
Если действительно важно ограничить все узлы в XML-документе определенным пространством имен, вы можете добиться этого, расширив базовый XmlReader
логика проверки найдена здесь .
public static void Main()
{
const string myNamespaceURN = "urn:my-namespace";
XmlSchemaSet sc = new XmlSchemaSet();
sc.Add(myNamespaceURN, "mySchema.xsd");
XmlReaderSettings settings = new XmlReaderSettings();
settings.ValidationType = ValidationType.Schema;
settings.Schemas = sc;
settings.ValidationEventHandler += ValidationCallBack;
XmlReader reader = XmlReader.Create("myDocument.xml", settings);
while (reader.Read())
{
if ((reader.NodeType == XmlNodeType.Element ||
reader.NodeType == XmlNodeType.Attribute)
&&
reader.NamespaceURI != myNamespaceURN)
{
LogError(reader.NamespaceURI + " is not a valid namespace.");
}
}
}
private static void ValidationCallBack(object sender, ValidationEventArgs e)
{
LogError(e.Message);
}
private static void LogError(string msg)
{
Console.WriteLine(msg);
}