У меня есть схема, которая определяет значения по умолчанию для элементов и атрибутов. Я пытаюсь проанализировать документ с помощью JAXB на основе этой схемы, но JAXB не устанавливает значения по умолчанию. Есть идеи, как заставить JAXB соблюдать значения по умолчанию из схемы?
example.xsd:
<?xml version="1.0" encoding="UTF-8"?><xs:schemaxmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org/example"
xmlns:tns="http://www.example.org/example">
<xs:element name="root" type="tns:rootType"/>
<xs:complexType name="rootType">
<xs:sequence>
<xs:element name="child" type="tns:childType"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="childType">
<xs:sequence>
<xs:element name="childVal" type="xs:string" default="defaultElVal"/>
</xs:sequence>
<xs:attribute name="attr" type="xs:string" default="defaultAttrVal"/>
</xs:complexType>
example1.xml
<?xml version="1.0" encoding="UTF-8"?>
<tns:root xmlns:tns="http://www.example.org/example" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.org/example example.xsd ">
<child>
<childVal/>
</child>
</tns:root>
TestParser.java
package test;
import java.io.File;
import javax.xml.XMLConstants;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
public class TestParser {
public static void main(String[] pArgs) {
try {
JAXBContext context = JAXBContext.newInstance(RootElement.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
SchemaFactory schemaFac = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema sysConfigSchema = schemaFac.newSchema(
new File("example.xsd"));
unmarshaller.setSchema(sysConfigSchema);
RootElement root = (RootElement)unmarshaller.unmarshal(
new File("example1.xml"));
System.out.println("Child Val: " + root.getChild().getChildVal());
System.out.println("Child Attr: " + root.getChild().getAttr());
} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
}
}
RootElement.java
package test;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name="root", namespace="http://www.example.org/example")
public class RootElement {
private ChildEl child;
public RootElement() {}
public ChildEl getChild() {
return child;
}
public void setChild(ChildEl pChild) {
this.child = pChild;
}
}
ChildEl.
{///
namespace PizzaSoftware.UI
{
/// <summary>
/// Interaction logic for LoginForm.xaml
/// </summary>
public partial class LoginForm : Window
{
public LoginForm()
{
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
Timer timer = new Timer(1000);
timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
timer.Enabled = true;
}
void timer_Elapsed(object sender, ElapsedEventArgs e)
{
lblCurrentTime.Content = DateTime.Now.ToShortTimeString();
}
}
}
По сути, я просто пытаюсь получить метка в моей форме, которая отображает текущее время. Я использую таймер, как было предложено в другом моем вопросе SO.
Я получаю сообщение об ошибке в заголовке. Что я могу сделать, чтобы решить эту проблему?