<!--
DTD for the Ndiff XML output format.
David Fifield <david@bamsoftware.com>

Ndiff XML output is similar to Nmap XML output. Inside of the root
nmapdiff element, the scandiff element represents a single diff of two
scans. Inside scandiff, host differences are within hostdiff elements
and port differences are within portdiff elements. These may appear
anywhere where host and port elements would appear, respectively.

Within a hostdiff or portdiff, differences are shown with a and b
elements, which show the state of things in the A and B
scan, respectively. These elements can appear most places in the output.

The output may contain hosts and ports that haven't changed. These are
stored in normal host and port elements.

Examples:
A host in the A scan but not in the B scan.
    <hostdiff>
        <a>
            <host>...</host>
        </a>
    </hostdiff>
A host in the B scan but not in the A scan.
    <hostdiff>
        <b>
            <host>...</host>
        </b>
    </hostdiff>
A host that gained a hostname and had a port change state. Port 22 is
unchanged.
    <hostdiff>
        <host>
            <hostnames>
                <hostname name="abc.example.com/>
                <b>
                    <hostname name="xyz.example.com/>
                </b>
            </hostnames>
            <ports>
                <portdiff>
                    <a>
                        <port portid="10" protocol="tcp">
                            <state state="open"/>
                        </port>
                    </a>
                    <b>
                        <port portid="10" protocol="tcp">
                            <state state="closed"/>
                        </port>
                    </b>
                    <port portid="22" protocol="tcp">
                        <state state="open"/>
                    </port>
                </portdiff>
            </ports>
        </host>
    </hostdiff>
-->

<!-- Parameter entities defining "data types" used in the rest of the
     DTD. -->
<!ENTITY % host-state "(unknown | up | down)">
<!ENTITY % address-type "(ipv4 | ipv6 | mac)">
<!ENTITY % protocol "(ip | tcp | udp)">
<!ENTITY % port-state "CDATA">

<!ELEMENT nmapdiff (scandiff)>
<!-- The current version is "1". Lack of a version attribute indicates
version 0, which was rather different. -->
<!ATTLIST nmapdiff version CDATA #IMPLIED>

<!ELEMENT scandiff (hostdiff | host)*>


<!ELEMENT hostdiff (host | (a, b?) | b)>

<!ELEMENT host (status | address | hostnames | ports | os | a | b)*>

<!ELEMENT status EMPTY>
<!ATTLIST status state %host-state; #REQUIRED>

<!ELEMENT hostnames (hostname | a | b)*>

<!ELEMENT address EMPTY>
<!ATTLIST address addr CDATA #REQUIRED
                  addrtype %address-type; "ipv4">

<!ELEMENT hostname EMPTY>
<!ATTLIST hostname name CDATA #REQUIRED>

<!ELEMENT ports ((extraports* | (a, b))?, (portdiff | port)*)>


<!ELEMENT portdiff ((a, b?) | b)>

<!ELEMENT extraports EMPTY>
<!ATTLIST extraports state %port-state; #REQUIRED
                     count CDATA #REQUIRED>

<!ELEMENT port (state?, service?)>
<!ATTLIST port protocol %protocol; #REQUIRED
               portid CDATA #REQUIRED>

<!ELEMENT state EMPTY>
<!ATTLIST state state %port-state; #REQUIRED>

<!ELEMENT service EMPTY>
<!ATTLIST service name CDATA #IMPLIED
                  product CDATA #IMPLIED
                  version CDATA #IMPLIED
                  extrainfo CDATA #IMPLIED
                  tunnel CDATA #IMPLIED>


<!ELEMENT os (osmatch | a | b)*>

<!ELEMENT osmatch EMPTY>
<!ATTLIST osmatch name CDATA #REQUIRED>

<!ENTITY % diff-elem "(host | hostname | extraports* | port | state | service | os | osmatch*)">
<!ELEMENT a %diff-elem;>
<!ELEMENT b %diff-elem;>
