Как очистить файл XML, удалив все элементы, отсутствующие в предоставленном XSD?
Это не работает:
public static void Main()
{
XmlTextReader xsdReader = new XmlTextReader(@"books.xsd");
XmlSchema schema = XmlSchema.Read(xsdReader, null);
XmlReaderSettings settings = new XmlReaderSettings();
settings.Schemas.Add(schema);
settings.ValidationType = ValidationType.Schema;
settings.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack);
XmlReader xmlReader = XmlReader.Create(@"books.xml", settings);
XmlWriter xmlWriter = XmlWriter.Create(@"books_clean.xml");
xmlWriter.WriteNode(xmlReader, true);
xmlWriter.Close();
xmlReader.Close();
}
private static void ValidationCallBack(object sender, ValidationEventArgs args)
{
((XmlReader)sender).Skip();
}
Когда я использую вышеупомянутое, вместо удаления всех «нежелательных» тегов, он удаляет только первый нежелательный тег и оставляет второй. Что касается того, почему мне нужно принять этот файл, я использую старый экземпляр SQLServer 2012, который требует XML, чтобы точно соответствовать XSD, даже если дополнительные элементы в XML не используются приложением. У меня нет контроля над исходным XML, который предоставляется сторонним инструментом с неопубликованным XSD.
Файлы примеров:
Books.xsd
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="bookstore">
<xs:complexType>
<xs:sequence>
<xs:element name="book" maxOccurs="unbounded" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element type="xs:string" name="title"/>
<xs:element type="xs:float" name="price"/>
</xs:sequence>
<xs:attribute type="xs:string" name="genre" use="optional"/>
<xs:attribute type="xs:string" name="ISBN" use="optional"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Books.xml
<bookstore>
<book genre='novel' ISBN='10-861003-324'>
<title>The Handmaid's Tale</title>
<price>19.95</price>
<junk>skdjgklsdg</junk>
<junk2>skdjgklsdg</junk2>
</book>
<book genre='novel' ISBN='1-861001-57-5'>
<title>Pride And Prejudice</title>
<price>24.95</price>
<junk>skdjgssklsdg</junk>
</book>
</bookstore>
Код в основном скопирован из: Проверка XML на XSD со ссылкой в C #