Merge pull request #236 from aschackmull/xml-qll/use-concat

Approved by hvitved, xiemaisi, yh-semmle
This commit is contained in:
semmle-qlci 2018-09-27 11:58:58 +01:00 коммит произвёл GitHub
Родитель c36e7f07be 9198f5b9bd
Коммит df4bd36b0f
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
4 изменённых файлов: 185 добавлений и 186 удалений

Просмотреть файл

@ -1,16 +1,16 @@
/** /**
* A library for working with XML files and their content. * Provides classes and predicates for working with XML files and their content.
*/ */
import semmle.code.cpp.Location import semmle.code.cpp.Location
/** An XML element that has a location. */ /** An XML element that has a location. */
abstract class XMLLocatable extends @xmllocatable { abstract class XMLLocatable extends @xmllocatable {
/** The source location for this element. */ /** Gets the source location for this element. */
Location getLocation() { xmllocations(this,result) } Location getLocation() { xmllocations(this,result) }
/** /**
* Whether this element has the specified location information, * Holds if this element has the specified location information,
* including file path, start line, start column, end line and end column. * including file path, start line, start column, end line and end column.
*/ */
predicate hasLocationInfo(string filepath, int startline, int startcolumn, int endline, int endcolumn) { predicate hasLocationInfo(string filepath, int startline, int startcolumn, int endline, int endcolumn) {
@ -20,7 +20,7 @@ abstract class XMLLocatable extends @xmllocatable {
) )
} }
/** A printable representation of this element. */ /** Gets a printable representation of this element. */
abstract string toString(); abstract string toString();
} }
@ -30,46 +30,49 @@ abstract class XMLLocatable extends @xmllocatable {
*/ */
class XMLParent extends @xmlparent { class XMLParent extends @xmlparent {
/** /**
* A printable representation of this XML parent. * Gets a printable representation of this XML parent.
* (Intended to be overridden in subclasses.) * (Intended to be overridden in subclasses.)
*/ */
abstract string getName(); abstract string getName();
/** The file to which this XML parent belongs. */ /** Gets the file to which this XML parent belongs. */
XMLFile getFile() { result = this or xmlElements(this,_,_,_,result) } XMLFile getFile() { result = this or xmlElements(this,_,_,_,result) }
/** The child element at a specified index of this XML parent. */ /** Gets the child element at a specified index of this XML parent. */
XMLElement getChild(int index) { xmlElements(result, _, this, index, _) } XMLElement getChild(int index) { xmlElements(result, _, this, index, _) }
/** A child element of this XML parent. */ /** Gets a child element of this XML parent. */
XMLElement getAChild() { xmlElements(result,_,this,_,_) } XMLElement getAChild() { xmlElements(result,_,this,_,_) }
/** A child element of this XML parent with the given `name`. */ /** Gets a child element of this XML parent with the given `name`. */
XMLElement getAChild(string name) { xmlElements(result,_,this,_,_) and result.hasName(name) } XMLElement getAChild(string name) { xmlElements(result,_,this,_,_) and result.hasName(name) }
/** A comment that is a child of this XML parent. */ /** Gets a comment that is a child of this XML parent. */
XMLComment getAComment() { xmlComments(result,_,this,_) } XMLComment getAComment() { xmlComments(result,_,this,_) }
/** A character sequence that is a child of this XML parent. */ /** Gets a character sequence that is a child of this XML parent. */
XMLCharacters getACharactersSet() { xmlChars(result,_,this,_,_,_) } XMLCharacters getACharactersSet() { xmlChars(result,_,this,_,_,_) }
/** The depth in the tree. (Overridden in XMLElement.) */ /** Gets the depth in the tree. (Overridden in XMLElement.) */
int getDepth() { result = 0 } int getDepth() { result = 0 }
/** The number of child XML elements of this XML parent. */ /** Gets the number of child XML elements of this XML parent. */
int getNumberOfChildren() { int getNumberOfChildren() {
result = count(XMLElement e | xmlElements(e,_,this,_,_)) result = count(XMLElement e | xmlElements(e,_,this,_,_))
} }
/** The number of places in the body of this XML parent where text occurs. */ /** Gets the number of places in the body of this XML parent where text occurs. */
int getNumberOfCharacterSets() { int getNumberOfCharacterSets() {
result = count(int pos | xmlChars(_,_,this,pos,_,_)) result = count(int pos | xmlChars(_,_,this,pos,_,_))
} }
/** /**
* DEPRECATED: Internal.
*
* Append the character sequences of this XML parent from left to right, separated by a space, * Append the character sequences of this XML parent from left to right, separated by a space,
* up to a specified (zero-based) index. * up to a specified (zero-based) index.
*/ */
deprecated
string charsSetUpTo(int n) { string charsSetUpTo(int n) {
(n = 0 and xmlChars(_,result,this,0,_,_)) or (n = 0 and xmlChars(_,result,this,0,_,_)) or
(n > 0 and exists(string chars | xmlChars(_,chars,this,n,_,_) | (n > 0 and exists(string chars | xmlChars(_,chars,this,n,_,_) |
@ -78,18 +81,15 @@ class XMLParent extends @xmlparent {
/** Append all the character sequences of this XML parent from left to right, separated by a space. */ /** Append all the character sequences of this XML parent from left to right, separated by a space. */
string allCharactersString() { string allCharactersString() {
exists(int n | n = this.getNumberOfCharacterSets() | result = concat(string chars, int pos | xmlChars(_, chars, this, pos, _, _) | chars, " " order by pos)
(n = 0 and result = "") or
(n > 0 and result = this.charsSetUpTo(n-1))
)
} }
/** The text value contained in this XML parent. */ /** Gets the text value contained in this XML parent. */
string getTextValue() { string getTextValue() {
result = allCharactersString() result = allCharactersString()
} }
/** A printable representation of this XML parent. */ /** Gets a printable representation of this XML parent. */
string toString() { result = this.getName() } string toString() { result = this.getName() }
} }
@ -99,54 +99,54 @@ class XMLFile extends XMLParent, File {
xmlEncoding(this,_) xmlEncoding(this,_)
} }
/** A printable representation of this XML file. */ /** Gets a printable representation of this XML file. */
override override
string toString() { result = XMLParent.super.toString() } string toString() { result = XMLParent.super.toString() }
/** The name of this XML file. */ /** Gets the name of this XML file. */
override override
string getName() { files(this,result,_,_,_) } string getName() { files(this,result,_,_,_) }
/** The path of this XML file. */ /** Gets the path of this XML file. */
string getPath() { files(this,_,result,_,_) } string getPath() { files(this,_,result,_,_) }
/** The path of the folder that contains this XML file. */ /** Gets the path of the folder that contains this XML file. */
string getFolder() { string getFolder() {
result = this.getPath().substring(0, this.getPath().length()-this.getName().length()) result = this.getPath().substring(0, this.getPath().length()-this.getName().length())
} }
/** The encoding of this XML file. */ /** Gets the encoding of this XML file. */
string getEncoding() { xmlEncoding(this,result) } string getEncoding() { xmlEncoding(this,result) }
/** The XML file itself. */ /** Gets the XML file itself. */
override override
XMLFile getFile() { result = this } XMLFile getFile() { result = this }
/** A top-most element in an XML file. */ /** Gets a top-most element in an XML file. */
XMLElement getARootElement() { result = this.getAChild() } XMLElement getARootElement() { result = this.getAChild() }
/** A DTD associated with this XML file. */ /** Gets a DTD associated with this XML file. */
XMLDTD getADTD() { xmlDTDs(result,_,_,_,this) } XMLDTD getADTD() { xmlDTDs(result,_,_,_,this) }
} }
/** A "Document Type Definition" of an XML file. */ /** A "Document Type Definition" of an XML file. */
class XMLDTD extends @xmldtd { class XMLDTD extends @xmldtd {
/** The name of the root element of this DTD. */ /** Gets the name of the root element of this DTD. */
string getRoot() { xmlDTDs(this,result,_,_,_) } string getRoot() { xmlDTDs(this,result,_,_,_) }
/** The public ID of this DTD. */ /** Gets the public ID of this DTD. */
string getPublicId() { xmlDTDs(this,_,result,_,_) } string getPublicId() { xmlDTDs(this,_,result,_,_) }
/** The system ID of this DTD. */ /** Gets the system ID of this DTD. */
string getSystemId() { xmlDTDs(this,_,_,result,_) } string getSystemId() { xmlDTDs(this,_,_,result,_) }
/** Whether this DTD is public. */ /** Holds if this DTD is public. */
predicate isPublic() { not xmlDTDs(this,_,"",_,_) } predicate isPublic() { not xmlDTDs(this,_,"",_,_) }
/** The parent of this DTD. */ /** Gets the parent of this DTD. */
XMLParent getParent() { xmlDTDs(this,_,_,_,result) } XMLParent getParent() { xmlDTDs(this,_,_,_,result) }
/** A printable representation of this DTD. */ /** Gets a printable representation of this DTD. */
string toString() { string toString() {
(this.isPublic() and result = this.getRoot() + " PUBLIC '" + (this.isPublic() and result = this.getRoot() + " PUBLIC '" +
this.getPublicId() + "' '" + this.getPublicId() + "' '" +
@ -159,92 +159,92 @@ class XMLDTD extends @xmldtd {
/** An XML tag in an XML file. */ /** An XML tag in an XML file. */
class XMLElement extends @xmlelement, XMLParent, XMLLocatable { class XMLElement extends @xmlelement, XMLParent, XMLLocatable {
/** Whether this XML element has the given `name`. */ /** Holds if this XML element has the given `name`. */
predicate hasName(string name) { name = getName() } predicate hasName(string name) { name = getName() }
/** The name of this XML element. */ /** Gets the name of this XML element. */
override override
string getName() { xmlElements(this,result,_,_,_) } string getName() { xmlElements(this,result,_,_,_) }
/** The XML file in which this XML element occurs. */ /** Gets the XML file in which this XML element occurs. */
override override
XMLFile getFile() { xmlElements(this,_,_,_,result) } XMLFile getFile() { xmlElements(this,_,_,_,result) }
/** The parent of this XML element. */ /** Gets the parent of this XML element. */
XMLParent getParent() { xmlElements(this,_,result,_,_) } XMLParent getParent() { xmlElements(this,_,result,_,_) }
/** The index of this XML element among its parent's children. */ /** Gets the index of this XML element among its parent's children. */
int getIndex() { xmlElements(this, _, _, result, _) } int getIndex() { xmlElements(this, _, _, result, _) }
/** Whether this XML element has a namespace. */ /** Holds if this XML element has a namespace. */
predicate hasNamespace() { xmlHasNs(this,_,_) } predicate hasNamespace() { xmlHasNs(this,_,_) }
/** The namespace of this XML element, if any. */ /** Gets the namespace of this XML element, if any. */
XMLNamespace getNamespace() { xmlHasNs(this,result,_) } XMLNamespace getNamespace() { xmlHasNs(this,result,_) }
/** The index of this XML element among its parent's children. */ /** Gets the index of this XML element among its parent's children. */
int getElementPositionIndex() { xmlElements(this,_,_,result,_) } int getElementPositionIndex() { xmlElements(this,_,_,result,_) }
/** The depth of this element within the XML file tree structure. */ /** Gets the depth of this element within the XML file tree structure. */
override override
int getDepth() { result = this.getParent().getDepth() + 1 } int getDepth() { result = this.getParent().getDepth() + 1 }
/** An XML attribute of this XML element. */ /** Gets an XML attribute of this XML element. */
XMLAttribute getAnAttribute() { result.getElement() = this } XMLAttribute getAnAttribute() { result.getElement() = this }
/** The attribute with the specified `name`, if any. */ /** Gets the attribute with the specified `name`, if any. */
XMLAttribute getAttribute(string name) { XMLAttribute getAttribute(string name) {
result.getElement() = this and result.getName() = name result.getElement() = this and result.getName() = name
} }
/** Whether this XML element has an attribute with the specified `name`. */ /** Holds if this XML element has an attribute with the specified `name`. */
predicate hasAttribute(string name) { predicate hasAttribute(string name) {
exists(XMLAttribute a| a = this.getAttribute(name)) exists(XMLAttribute a| a = this.getAttribute(name))
} }
/** The value of the attribute with the specified `name`, if any. */ /** Gets the value of the attribute with the specified `name`, if any. */
string getAttributeValue(string name) { string getAttributeValue(string name) {
result = this.getAttribute(name).getValue() result = this.getAttribute(name).getValue()
} }
/** A printable representation of this XML element. */ /** Gets a printable representation of this XML element. */
override override
string toString() { result = XMLParent.super.toString() } string toString() { result = XMLParent.super.toString() }
} }
/** An attribute that occurs inside an XML element. */ /** An attribute that occurs inside an XML element. */
class XMLAttribute extends @xmlattribute, XMLLocatable { class XMLAttribute extends @xmlattribute, XMLLocatable {
/** The name of this attribute. */ /** Gets the name of this attribute. */
string getName() { xmlAttrs(this,_,result,_,_,_) } string getName() { xmlAttrs(this,_,result,_,_,_) }
/** The XML element to which this attribute belongs. */ /** Gets the XML element to which this attribute belongs. */
XMLElement getElement() { xmlAttrs(this,result,_,_,_,_) } XMLElement getElement() { xmlAttrs(this,result,_,_,_,_) }
/** Whether this attribute has a namespace. */ /** Holds if this attribute has a namespace. */
predicate hasNamespace() { xmlHasNs(this,_,_) } predicate hasNamespace() { xmlHasNs(this,_,_) }
/** The namespace of this attribute, if any. */ /** Gets the namespace of this attribute, if any. */
XMLNamespace getNamespace() { xmlHasNs(this,result,_) } XMLNamespace getNamespace() { xmlHasNs(this,result,_) }
/** The value of this attribute. */ /** Gets the value of this attribute. */
string getValue() { xmlAttrs(this,_,_,result,_,_) } string getValue() { xmlAttrs(this,_,_,result,_,_) }
/** A printable representation of this XML attribute. */ /** Gets a printable representation of this XML attribute. */
override string toString() { result = this.getName() + "=" + this.getValue() } override string toString() { result = this.getName() + "=" + this.getValue() }
} }
/** A namespace used in an XML file */ /** A namespace used in an XML file */
class XMLNamespace extends @xmlnamespace { class XMLNamespace extends @xmlnamespace {
/** The prefix of this namespace. */ /** Gets the prefix of this namespace. */
string getPrefix() { xmlNs(this,result,_,_) } string getPrefix() { xmlNs(this,result,_,_) }
/** The URI of this namespace. */ /** Gets the URI of this namespace. */
string getURI() { xmlNs(this,_,result,_) } string getURI() { xmlNs(this,_,result,_) }
/** Whether this namespace has no prefix. */ /** Holds if this namespace has no prefix. */
predicate isDefault() { this.getPrefix() = "" } predicate isDefault() { this.getPrefix() = "" }
/** A printable representation of this XML namespace. */ /** Gets a printable representation of this XML namespace. */
string toString() { string toString() {
(this.isDefault() and result = this.getURI()) or (this.isDefault() and result = this.getURI()) or
(not this.isDefault() and result = this.getPrefix() + ":" + this.getURI()) (not this.isDefault() and result = this.getPrefix() + ":" + this.getURI())
@ -253,13 +253,13 @@ class XMLNamespace extends @xmlnamespace {
/** A comment of the form `<!-- ... -->` is an XML comment. */ /** A comment of the form `<!-- ... -->` is an XML comment. */
class XMLComment extends @xmlcomment, XMLLocatable { class XMLComment extends @xmlcomment, XMLLocatable {
/** The text content of this XML comment. */ /** Gets the text content of this XML comment. */
string getText() { xmlComments(this,result,_,_) } string getText() { xmlComments(this,result,_,_) }
/** The parent of this XML comment. */ /** Gets the parent of this XML comment. */
XMLParent getParent() { xmlComments(this,_,result,_) } XMLParent getParent() { xmlComments(this,_,result,_) }
/** A printable representation of this XML comment. */ /** Gets a printable representation of this XML comment. */
override string toString() { result = this.getText() } override string toString() { result = this.getText() }
} }
@ -268,15 +268,15 @@ class XMLComment extends @xmlcomment, XMLLocatable {
* closing tags of an XML element, excluding other elements. * closing tags of an XML element, excluding other elements.
*/ */
class XMLCharacters extends @xmlcharacters, XMLLocatable { class XMLCharacters extends @xmlcharacters, XMLLocatable {
/** The content of this character sequence. */ /** Gets the content of this character sequence. */
string getCharacters() { xmlChars(this,result,_,_,_,_) } string getCharacters() { xmlChars(this,result,_,_,_,_) }
/** The parent of this character sequence. */ /** Gets the parent of this character sequence. */
XMLParent getParent() { xmlChars(this,_,result,_,_,_) } XMLParent getParent() { xmlChars(this,_,result,_,_,_) }
/** Whether this character sequence is CDATA. */ /** Holds if this character sequence is CDATA. */
predicate isCDATA() { xmlChars(this,_,_,_,1,_) } predicate isCDATA() { xmlChars(this,_,_,_,1,_) }
/** A printable representation of this XML character sequence. */ /** Gets a printable representation of this XML character sequence. */
override string toString() { result = this.getCharacters() } override string toString() { result = this.getCharacters() }
} }

Просмотреть файл

@ -1,5 +1,5 @@
/** /**
* A library for working with XML files and their content. * Provides classes and predicates for working with XML files and their content.
*/ */
import semmle.code.csharp.Element import semmle.code.csharp.Element
@ -18,7 +18,7 @@ class XMLLocatable extends @xmllocatable {
not this instanceof File // in the dbscheme not this instanceof File // in the dbscheme
} }
/** The source location for this element. */ /** Gets the source location for this element. */
Location getALocation() { xmllocations(this,result) } Location getALocation() { xmllocations(this,result) }
/** /**
@ -32,7 +32,7 @@ class XMLLocatable extends @xmllocatable {
) )
} }
/** A printable representation of this element. */ /** Gets a printable representation of this element. */
abstract string toString(); abstract string toString();
} }
@ -42,46 +42,49 @@ class XMLLocatable extends @xmllocatable {
*/ */
class XMLParent extends @xmlparent { class XMLParent extends @xmlparent {
/** /**
* A printable representation of this XML parent. * Gets a printable representation of this XML parent.
* (Intended to be overridden in subclasses.) * (Intended to be overridden in subclasses.)
*/ */
abstract string getName(); abstract string getName();
/** The file to which this XML parent belongs. */ /** Gets the file to which this XML parent belongs. */
XMLFile getFile() { result = this or xmlElements(this,_,_,_,result) } XMLFile getFile() { result = this or xmlElements(this,_,_,_,result) }
/** The child element at a specified index of this XML parent. */ /** Gets the child element at a specified index of this XML parent. */
XMLElement getChild(int index) { xmlElements(result, _, this, index, _) } XMLElement getChild(int index) { xmlElements(result, _, this, index, _) }
/** A child element of this XML parent. */ /** Gets a child element of this XML parent. */
XMLElement getAChild() { xmlElements(result,_,this,_,_) } XMLElement getAChild() { xmlElements(result,_,this,_,_) }
/** A child element of this XML parent with the given `name`. */ /** Gets a child element of this XML parent with the given `name`. */
XMLElement getAChild(string name) { xmlElements(result,_,this,_,_) and result.hasName(name) } XMLElement getAChild(string name) { xmlElements(result,_,this,_,_) and result.hasName(name) }
/** A comment that is a child of this XML parent. */ /** Gets a comment that is a child of this XML parent. */
XMLComment getAComment() { xmlComments(result,_,this,_) } XMLComment getAComment() { xmlComments(result,_,this,_) }
/** A character sequence that is a child of this XML parent. */ /** Gets a character sequence that is a child of this XML parent. */
XMLCharacters getACharactersSet() { xmlChars(result,_,this,_,_,_) } XMLCharacters getACharactersSet() { xmlChars(result,_,this,_,_,_) }
/** The depth in the tree. (Overridden in XMLElement.) */ /** Gets the depth in the tree. (Overridden in XMLElement.) */
int getDepth() { result = 0 } int getDepth() { result = 0 }
/** The number of child XML elements of this XML parent. */ /** Gets the number of child XML elements of this XML parent. */
int getNumberOfChildren() { int getNumberOfChildren() {
result = count(XMLElement e | xmlElements(e,_,this,_,_)) result = count(XMLElement e | xmlElements(e,_,this,_,_))
} }
/** The number of places in the body of this XML parent where text occurs. */ /** Gets the number of places in the body of this XML parent where text occurs. */
int getNumberOfCharacterSets() { int getNumberOfCharacterSets() {
result = count(int pos | xmlChars(_,_,this,pos,_,_)) result = count(int pos | xmlChars(_,_,this,pos,_,_))
} }
/** /**
* DEPRECATED: Internal.
*
* Append the character sequences of this XML parent from left to right, separated by a space, * Append the character sequences of this XML parent from left to right, separated by a space,
* up to a specified (zero-based) index. * up to a specified (zero-based) index.
*/ */
deprecated
string charsSetUpTo(int n) { string charsSetUpTo(int n) {
(n = 0 and xmlChars(_,result,this,0,_,_)) or (n = 0 and xmlChars(_,result,this,0,_,_)) or
(n > 0 and exists(string chars | xmlChars(_,chars,this,n,_,_) | (n > 0 and exists(string chars | xmlChars(_,chars,this,n,_,_) |
@ -90,18 +93,15 @@ class XMLParent extends @xmlparent {
/** Append all the character sequences of this XML parent from left to right, separated by a space. */ /** Append all the character sequences of this XML parent from left to right, separated by a space. */
string allCharactersString() { string allCharactersString() {
exists(int n | n = this.getNumberOfCharacterSets() | result = concat(string chars, int pos | xmlChars(_, chars, this, pos, _, _) | chars, " " order by pos)
(n = 0 and result = "") or
(n > 0 and result = this.charsSetUpTo(n-1))
)
} }
/** The text value contained in this XML parent. */ /** Gets the text value contained in this XML parent. */
string getTextValue() { string getTextValue() {
result = allCharactersString() result = allCharactersString()
} }
/** A printable representation of this XML parent. */ /** Gets a printable representation of this XML parent. */
string toString() { result = this.getName() } string toString() { result = this.getName() }
} }
@ -111,51 +111,52 @@ class XMLFile extends XMLParent, File {
xmlEncoding(this,_) xmlEncoding(this,_)
} }
/** A printable representation of this XML file. */ /** Gets a printable representation of this XML file. */
override string toString() { result = XMLParent.super.toString() } override string toString() { result = XMLParent.super.toString() }
/** The name of this XML file. */ /** Gets the name of this XML file. */
override string getName() { files(this,result,_,_,_) } override string getName() { files(this,result,_,_,_) }
/** The path of this XML file. */ /** Gets the path of this XML file. */
string getPath() { files(this,_,result,_,_) } string getPath() { files(this,_,result,_,_) }
/** The path of the folder that contains this XML file. */ /** Gets the path of the folder that contains this XML file. */
string getFolder() { string getFolder() {
result = this.getPath().substring(0, this.getPath().length()-this.getName().length()) result = this.getPath().substring(0, this.getPath().length()-this.getName().length())
} }
/** The encoding of this XML file. */ /** Gets the encoding of this XML file. */
string getEncoding() { xmlEncoding(this,result) } string getEncoding() { xmlEncoding(this,result) }
/** The XML file itself. */ /** Gets the XML file itself. */
override override
XMLFile getFile() { result = this } XMLFile getFile() { result = this }
/** A top-most element in an XML file. */ /** Gets a top-most element in an XML file. */
XMLElement getARootElement() { result = this.getAChild() } XMLElement getARootElement() { result = this.getAChild() }
/** A DTD associated with this XML file. */ /** Gets a DTD associated with this XML file. */
XMLDTD getADTD() { xmlDTDs(result,_,_,_,this) } XMLDTD getADTD() { xmlDTDs(result,_,_,_,this) }
} }
/** A "Document Type Definition" of an XML file. */ /** A "Document Type Definition" of an XML file. */
class XMLDTD extends XMLLocatable, @xmldtd { class XMLDTD extends XMLLocatable, @xmldtd {
/** The name of the root element of this DTD. */ /** Gets the name of the root element of this DTD. */
string getRoot() { xmlDTDs(this,result,_,_,_) } string getRoot() { xmlDTDs(this,result,_,_,_) }
/** The public ID of this DTD. */ /** Gets the public ID of this DTD. */
string getPublicId() { xmlDTDs(this,_,result,_,_) } string getPublicId() { xmlDTDs(this,_,result,_,_) }
/** The system ID of this DTD. */ /** Gets the system ID of this DTD. */
string getSystemId() { xmlDTDs(this,_,_,result,_) } string getSystemId() { xmlDTDs(this,_,_,result,_) }
/** Whether this DTD is public. */ /** Holds if this DTD is public. */
predicate isPublic() { not xmlDTDs(this,_,"",_,_) } predicate isPublic() { not xmlDTDs(this,_,"",_,_) }
/** The parent of this DTD. */ /** Gets the parent of this DTD. */
XMLParent getParent() { xmlDTDs(this,_,_,_,result) } XMLParent getParent() { xmlDTDs(this,_,_,_,result) }
/** Gets a printable representation of this DTD. */
override string toString() { override string toString() {
(this.isPublic() and result = this.getRoot() + " PUBLIC '" + (this.isPublic() and result = this.getRoot() + " PUBLIC '" +
this.getPublicId() + "' '" + this.getPublicId() + "' '" +
@ -168,89 +169,87 @@ class XMLDTD extends XMLLocatable, @xmldtd {
/** An XML tag in an XML file. */ /** An XML tag in an XML file. */
class XMLElement extends @xmlelement, XMLParent, XMLLocatable { class XMLElement extends @xmlelement, XMLParent, XMLLocatable {
/** Whether this XML element has the given `name`. */ /** Holds if this XML element has the given `name`. */
predicate hasName(string name) { name = getName() } predicate hasName(string name) { name = getName() }
/** The name of this XML element. */ /** Gets the name of this XML element. */
override
override string getName() { xmlElements(this,result,_,_,_) } override string getName() { xmlElements(this,result,_,_,_) }
/** The XML file in which this XML element occurs. */ /** Gets the XML file in which this XML element occurs. */
override override
XMLFile getFile() { xmlElements(this,_,_,_,result) } XMLFile getFile() { xmlElements(this,_,_,_,result) }
/** The parent of this XML element. */ /** Gets the parent of this XML element. */
XMLParent getParent() { xmlElements(this,_,result,_,_) } XMLParent getParent() { xmlElements(this,_,result,_,_) }
/** The index of this XML element among its parent's children. */ /** Gets the index of this XML element among its parent's children. */
int getIndex() { xmlElements(this, _, _, result, _) } int getIndex() { xmlElements(this, _, _, result, _) }
/** Whether this XML element has a namespace. */ /** Holds if this XML element has a namespace. */
predicate hasNamespace() { xmlHasNs(this,_,_) } predicate hasNamespace() { xmlHasNs(this,_,_) }
/** The namespace of this XML element, if any. */ /** Gets the namespace of this XML element, if any. */
XMLNamespace getNamespace() { xmlHasNs(this,result,_) } XMLNamespace getNamespace() { xmlHasNs(this,result,_) }
/** The index of this XML element among its parent's children. */ /** Gets the index of this XML element among its parent's children. */
int getElementPositionIndex() { xmlElements(this,_,_,result,_) } int getElementPositionIndex() { xmlElements(this,_,_,result,_) }
/** The depth of this element within the XML file tree structure. */ /** Gets the depth of this element within the XML file tree structure. */
override override
int getDepth() { result = this.getParent().getDepth() + 1 } int getDepth() { result = this.getParent().getDepth() + 1 }
/** An XML attribute of this XML element. */ /** Gets an XML attribute of this XML element. */
XMLAttribute getAnAttribute() { result.getElement() = this } XMLAttribute getAnAttribute() { result.getElement() = this }
/** The attribute with the specified `name`, if any. */ /** Gets the attribute with the specified `name`, if any. */
XMLAttribute getAttribute(string name) { XMLAttribute getAttribute(string name) {
result.getElement() = this and result.getName() = name result.getElement() = this and result.getName() = name
} }
/** Whether this XML element has an attribute with the specified `name`. */ /** Holds if this XML element has an attribute with the specified `name`. */
predicate hasAttribute(string name) { predicate hasAttribute(string name) {
exists(XMLAttribute a| a = this.getAttribute(name)) exists(XMLAttribute a| a = this.getAttribute(name))
} }
/** The value of the attribute with the specified `name`, if any. */ /** Gets the value of the attribute with the specified `name`, if any. */
string getAttributeValue(string name) { string getAttributeValue(string name) {
result = this.getAttribute(name).getValue() result = this.getAttribute(name).getValue()
} }
/** A printable representation of this XML element. */ /** Gets a printable representation of this XML element. */
override
override string toString() { result = XMLParent.super.toString() } override string toString() { result = XMLParent.super.toString() }
} }
/** An attribute that occurs inside an XML element. */ /** An attribute that occurs inside an XML element. */
class XMLAttribute extends @xmlattribute, XMLLocatable { class XMLAttribute extends @xmlattribute, XMLLocatable {
/** The name of this attribute. */ /** Gets the name of this attribute. */
string getName() { xmlAttrs(this,_,result,_,_,_) } string getName() { xmlAttrs(this,_,result,_,_,_) }
/** The XML element to which this attribute belongs. */ /** Gets the XML element to which this attribute belongs. */
XMLElement getElement() { xmlAttrs(this,result,_,_,_,_) } XMLElement getElement() { xmlAttrs(this,result,_,_,_,_) }
/** Whether this attribute has a namespace. */ /** Holds if this attribute has a namespace. */
predicate hasNamespace() { xmlHasNs(this,_,_) } predicate hasNamespace() { xmlHasNs(this,_,_) }
/** The namespace of this attribute, if any. */ /** Gets the namespace of this attribute, if any. */
XMLNamespace getNamespace() { xmlHasNs(this,result,_) } XMLNamespace getNamespace() { xmlHasNs(this,result,_) }
/** The value of this attribute. */ /** Gets the value of this attribute. */
string getValue() { xmlAttrs(this,_,_,result,_,_) } string getValue() { xmlAttrs(this,_,_,result,_,_) }
/** A printable representation of this XML attribute. */ /** Gets a printable representation of this XML attribute. */
override string toString() { result = this.getName() + "=" + this.getValue() } override string toString() { result = this.getName() + "=" + this.getValue() }
} }
/** A namespace used in an XML file */ /** A namespace used in an XML file */
class XMLNamespace extends XMLLocatable, @xmlnamespace { class XMLNamespace extends XMLLocatable, @xmlnamespace {
/** The prefix of this namespace. */ /** Gets the prefix of this namespace. */
string getPrefix() { xmlNs(this,result,_,_) } string getPrefix() { xmlNs(this,result,_,_) }
/** The URI of this namespace. */ /** Gets the URI of this namespace. */
string getURI() { xmlNs(this,_,result,_) } string getURI() { xmlNs(this,_,result,_) }
/** Whether this namespace has no prefix. */ /** Holds if this namespace has no prefix. */
predicate isDefault() { this.getPrefix() = "" } predicate isDefault() { this.getPrefix() = "" }
override string toString() { override string toString() {
@ -261,13 +260,13 @@ class XMLNamespace extends XMLLocatable, @xmlnamespace {
/** A comment of the form `<!-- ... -->` is an XML comment. */ /** A comment of the form `<!-- ... -->` is an XML comment. */
class XMLComment extends @xmlcomment, XMLLocatable { class XMLComment extends @xmlcomment, XMLLocatable {
/** The text content of this XML comment. */ /** Gets the text content of this XML comment. */
string getText() { xmlComments(this,result,_,_) } string getText() { xmlComments(this,result,_,_) }
/** The parent of this XML comment. */ /** Gets the parent of this XML comment. */
XMLParent getParent() { xmlComments(this,_,result,_) } XMLParent getParent() { xmlComments(this,_,result,_) }
/** A printable representation of this XML comment. */ /** Gets a printable representation of this XML comment. */
override string toString() { result = this.getText() } override string toString() { result = this.getText() }
} }
@ -276,15 +275,15 @@ class XMLComment extends @xmlcomment, XMLLocatable {
* closing tags of an XML element, excluding other elements. * closing tags of an XML element, excluding other elements.
*/ */
class XMLCharacters extends @xmlcharacters, XMLLocatable { class XMLCharacters extends @xmlcharacters, XMLLocatable {
/** The content of this character sequence. */ /** Gets the content of this character sequence. */
string getCharacters() { xmlChars(this,result,_,_,_,_) } string getCharacters() { xmlChars(this,result,_,_,_,_) }
/** The parent of this character sequence. */ /** Gets the parent of this character sequence. */
XMLParent getParent() { xmlChars(this,_,result,_,_,_) } XMLParent getParent() { xmlChars(this,_,result,_,_,_) }
/** Whether this character sequence is CDATA. */ /** Holds if this character sequence is CDATA. */
predicate isCDATA() { xmlChars(this,_,_,_,1,_) } predicate isCDATA() { xmlChars(this,_,_,_,1,_) }
/** A printable representation of this XML character sequence. */ /** Gets a printable representation of this XML character sequence. */
override string toString() { result = this.getCharacters() } override string toString() { result = this.getCharacters() }
} }

Просмотреть файл

@ -70,9 +70,12 @@ class XMLParent extends @xmlparent {
} }
/** /**
* DEPRECATED: Internal.
*
* Append the character sequences of this XML parent from left to right, separated by a space, * Append the character sequences of this XML parent from left to right, separated by a space,
* up to a specified (zero-based) index. * up to a specified (zero-based) index.
*/ */
deprecated
string charsSetUpTo(int n) { string charsSetUpTo(int n) {
n = 0 and xmlChars(_,result,this,0,_,_) n = 0 and xmlChars(_,result,this,0,_,_)
or or
@ -84,10 +87,7 @@ class XMLParent extends @xmlparent {
/** Append all the character sequences of this XML parent from left to right, separated by a space. */ /** Append all the character sequences of this XML parent from left to right, separated by a space. */
string allCharactersString() { string allCharactersString() {
exists(int n | n = this.getNumberOfCharacterSets() | result = concat(string chars, int pos | xmlChars(_, chars, this, pos, _, _) | chars, " " order by pos)
(n = 0 and result = "") or
(n > 0 and result = this.charsSetUpTo(n-1))
)
} }
/** Gets the text value contained in this XML parent. */ /** Gets the text value contained in this XML parent. */

Просмотреть файл

@ -6,7 +6,7 @@ import javascript
/** An XML element that has a location. */ /** An XML element that has a location. */
abstract class XMLLocatable extends @xmllocatable { abstract class XMLLocatable extends @xmllocatable {
/** The source location for this element. */ /** Gets the source location for this element. */
Location getLocation() { xmllocations(this,result) } Location getLocation() { xmllocations(this,result) }
/** /**
@ -33,46 +33,49 @@ abstract class XMLLocatable extends @xmllocatable {
*/ */
class XMLParent extends @xmlparent { class XMLParent extends @xmlparent {
/** /**
* A printable representation of this XML parent. * Gets a printable representation of this XML parent.
* (Intended to be overridden in subclasses.) * (Intended to be overridden in subclasses.)
*/ */
abstract string getName(); abstract string getName();
/** The file to which this XML parent belongs. */ /** Gets the file to which this XML parent belongs. */
XMLFile getFile() { result = this or xmlElements(this,_,_,_,result) } XMLFile getFile() { result = this or xmlElements(this,_,_,_,result) }
/** The child element at a specified index of this XML parent. */ /** Gets the child element at a specified index of this XML parent. */
XMLElement getChild(int index) { xmlElements(result, _, this, index, _) } XMLElement getChild(int index) { xmlElements(result, _, this, index, _) }
/** A child element of this XML parent. */ /** Gets a child element of this XML parent. */
XMLElement getAChild() { xmlElements(result,_,this,_,_) } XMLElement getAChild() { xmlElements(result,_,this,_,_) }
/** A child element of this XML parent with the given `name`. */ /** Gets a child element of this XML parent with the given `name`. */
XMLElement getAChild(string name) { xmlElements(result,_,this,_,_) and result.hasName(name) } XMLElement getAChild(string name) { xmlElements(result,_,this,_,_) and result.hasName(name) }
/** A comment that is a child of this XML parent. */ /** Gets a comment that is a child of this XML parent. */
XMLComment getAComment() { xmlComments(result,_,this,_) } XMLComment getAComment() { xmlComments(result,_,this,_) }
/** A character sequence that is a child of this XML parent. */ /** Gets a character sequence that is a child of this XML parent. */
XMLCharacters getACharactersSet() { xmlChars(result,_,this,_,_,_) } XMLCharacters getACharactersSet() { xmlChars(result,_,this,_,_,_) }
/** The depth in the tree. (Overridden in XMLElement.) */ /** Gets the depth in the tree. (Overridden in XMLElement.) */
int getDepth() { result = 0 } int getDepth() { result = 0 }
/** The number of child XML elements of this XML parent. */ /** Gets the number of child XML elements of this XML parent. */
int getNumberOfChildren() { int getNumberOfChildren() {
result = count(XMLElement e | xmlElements(e,_,this,_,_)) result = count(XMLElement e | xmlElements(e,_,this,_,_))
} }
/** The number of places in the body of this XML parent where text occurs. */ /** Gets the number of places in the body of this XML parent where text occurs. */
int getNumberOfCharacterSets() { int getNumberOfCharacterSets() {
result = count(int pos | xmlChars(_,_,this,pos,_,_)) result = count(int pos | xmlChars(_,_,this,pos,_,_))
} }
/** /**
* DEPRECATED: Internal.
*
* Append the character sequences of this XML parent from left to right, separated by a space, * Append the character sequences of this XML parent from left to right, separated by a space,
* up to a specified (zero-based) index. * up to a specified (zero-based) index.
*/ */
deprecated
string charsSetUpTo(int n) { string charsSetUpTo(int n) {
(n = 0 and xmlChars(_,result,this,0,_,_)) or (n = 0 and xmlChars(_,result,this,0,_,_)) or
(n > 0 and exists(string chars | xmlChars(_,chars,this,n,_,_) | (n > 0 and exists(string chars | xmlChars(_,chars,this,n,_,_) |
@ -81,18 +84,15 @@ class XMLParent extends @xmlparent {
/** Append all the character sequences of this XML parent from left to right, separated by a space. */ /** Append all the character sequences of this XML parent from left to right, separated by a space. */
string allCharactersString() { string allCharactersString() {
exists(int n | n = this.getNumberOfCharacterSets() | result = concat(string chars, int pos | xmlChars(_, chars, this, pos, _, _) | chars, " " order by pos)
(n = 0 and result = "") or
(n > 0 and result = this.charsSetUpTo(n-1))
)
} }
/** The text value contained in this XML parent. */ /** Gets the text value contained in this XML parent. */
string getTextValue() { string getTextValue() {
result = allCharactersString() result = allCharactersString()
} }
/** A printable representation of this XML parent. */ /** Gets a printable representation of this XML parent. */
string toString() { result = this.getName() } string toString() { result = this.getName() }
} }
@ -102,46 +102,46 @@ class XMLFile extends XMLParent, File {
xmlEncoding(this,_) xmlEncoding(this,_)
} }
/** A printable representation of this XML file. */ /** Gets a printable representation of this XML file. */
override override
string toString() { result = XMLParent.super.toString() } string toString() { result = XMLParent.super.toString() }
/** The name of this XML file. */ /** Gets the name of this XML file. */
override override
string getName() { result = File.super.getAbsolutePath() } string getName() { result = File.super.getAbsolutePath() }
/** The encoding of this XML file. */ /** Gets the encoding of this XML file. */
string getEncoding() { xmlEncoding(this,result) } string getEncoding() { xmlEncoding(this,result) }
/** The XML file itself. */ /** Gets the XML file itself. */
override override
XMLFile getFile() { result = this } XMLFile getFile() { result = this }
/** A top-most element in an XML file. */ /** Gets a top-most element in an XML file. */
XMLElement getARootElement() { result = this.getAChild() } XMLElement getARootElement() { result = this.getAChild() }
/** A DTD associated with this XML file. */ /** Gets a DTD associated with this XML file. */
XMLDTD getADTD() { xmlDTDs(result,_,_,_,this) } XMLDTD getADTD() { xmlDTDs(result,_,_,_,this) }
} }
/** A "Document Type Definition" of an XML file. */ /** A "Document Type Definition" of an XML file. */
class XMLDTD extends @xmldtd { class XMLDTD extends @xmldtd {
/** The name of the root element of this DTD. */ /** Gets the name of the root element of this DTD. */
string getRoot() { xmlDTDs(this,result,_,_,_) } string getRoot() { xmlDTDs(this,result,_,_,_) }
/** The public ID of this DTD. */ /** Gets the public ID of this DTD. */
string getPublicId() { xmlDTDs(this,_,result,_,_) } string getPublicId() { xmlDTDs(this,_,result,_,_) }
/** The system ID of this DTD. */ /** Gets the system ID of this DTD. */
string getSystemId() { xmlDTDs(this,_,_,result,_) } string getSystemId() { xmlDTDs(this,_,_,result,_) }
/** Holds if this DTD is public. */ /** Holds if this DTD is public. */
predicate isPublic() { not xmlDTDs(this,_,"",_,_) } predicate isPublic() { not xmlDTDs(this,_,"",_,_) }
/** The parent of this DTD. */ /** Gets the parent of this DTD. */
XMLParent getParent() { xmlDTDs(this,_,_,_,result) } XMLParent getParent() { xmlDTDs(this,_,_,_,result) }
/** A printable representation of this DTD. */ /** Gets a printable representation of this DTD. */
string toString() { string toString() {
(this.isPublic() and result = this.getRoot() + " PUBLIC '" + (this.isPublic() and result = this.getRoot() + " PUBLIC '" +
this.getPublicId() + "' '" + this.getPublicId() + "' '" +
@ -157,37 +157,37 @@ class XMLElement extends @xmlelement, XMLParent, XMLLocatable {
/** Holds if this XML element has the given `name`. */ /** Holds if this XML element has the given `name`. */
predicate hasName(string name) { name = getName() } predicate hasName(string name) { name = getName() }
/** The name of this XML element. */ /** Gets the name of this XML element. */
override override
string getName() { xmlElements(this,result,_,_,_) } string getName() { xmlElements(this,result,_,_,_) }
/** The XML file in which this XML element occurs. */ /** Gets the XML file in which this XML element occurs. */
override override
XMLFile getFile() { xmlElements(this,_,_,_,result) } XMLFile getFile() { xmlElements(this,_,_,_,result) }
/** The parent of this XML element. */ /** Gets the parent of this XML element. */
XMLParent getParent() { xmlElements(this,_,result,_,_) } XMLParent getParent() { xmlElements(this,_,result,_,_) }
/** The index of this XML element among its parent's children. */ /** Gets the index of this XML element among its parent's children. */
int getIndex() { xmlElements(this, _, _, result, _) } int getIndex() { xmlElements(this, _, _, result, _) }
/** Holds if this XML element has a namespace. */ /** Holds if this XML element has a namespace. */
predicate hasNamespace() { xmlHasNs(this,_,_) } predicate hasNamespace() { xmlHasNs(this,_,_) }
/** The namespace of this XML element, if any. */ /** Gets the namespace of this XML element, if any. */
XMLNamespace getNamespace() { xmlHasNs(this,result,_) } XMLNamespace getNamespace() { xmlHasNs(this,result,_) }
/** The index of this XML element among its parent's children. */ /** Gets the index of this XML element among its parent's children. */
int getElementPositionIndex() { xmlElements(this,_,_,result,_) } int getElementPositionIndex() { xmlElements(this,_,_,result,_) }
/** The depth of this element within the XML file tree structure. */ /** Gets the depth of this element within the XML file tree structure. */
override override
int getDepth() { result = this.getParent().getDepth() + 1 } int getDepth() { result = this.getParent().getDepth() + 1 }
/** An XML attribute of this XML element. */ /** Gets an XML attribute of this XML element. */
XMLAttribute getAnAttribute() { result.getElement() = this } XMLAttribute getAnAttribute() { result.getElement() = this }
/** The attribute with the specified `name`, if any. */ /** Gets the attribute with the specified `name`, if any. */
XMLAttribute getAttribute(string name) { XMLAttribute getAttribute(string name) {
result.getElement() = this and result.getName() = name result.getElement() = this and result.getName() = name
} }
@ -197,49 +197,49 @@ class XMLElement extends @xmlelement, XMLParent, XMLLocatable {
exists(XMLAttribute a| a = this.getAttribute(name)) exists(XMLAttribute a| a = this.getAttribute(name))
} }
/** The value of the attribute with the specified `name`, if any. */ /** Gets the value of the attribute with the specified `name`, if any. */
string getAttributeValue(string name) { string getAttributeValue(string name) {
result = this.getAttribute(name).getValue() result = this.getAttribute(name).getValue()
} }
/** A printable representation of this XML element. */ /** Gets a printable representation of this XML element. */
override override
string toString() { result = XMLParent.super.toString() } string toString() { result = XMLParent.super.toString() }
} }
/** An attribute that occurs inside an XML element. */ /** An attribute that occurs inside an XML element. */
class XMLAttribute extends @xmlattribute, XMLLocatable { class XMLAttribute extends @xmlattribute, XMLLocatable {
/** The name of this attribute. */ /** Gets the name of this attribute. */
string getName() { xmlAttrs(this,_,result,_,_,_) } string getName() { xmlAttrs(this,_,result,_,_,_) }
/** The XML element to which this attribute belongs. */ /** Gets the XML element to which this attribute belongs. */
XMLElement getElement() { xmlAttrs(this,result,_,_,_,_) } XMLElement getElement() { xmlAttrs(this,result,_,_,_,_) }
/** Holds if this attribute has a namespace. */ /** Holds if this attribute has a namespace. */
predicate hasNamespace() { xmlHasNs(this,_,_) } predicate hasNamespace() { xmlHasNs(this,_,_) }
/** The namespace of this attribute, if any. */ /** Gets the namespace of this attribute, if any. */
XMLNamespace getNamespace() { xmlHasNs(this,result,_) } XMLNamespace getNamespace() { xmlHasNs(this,result,_) }
/** The value of this attribute. */ /** Gets the value of this attribute. */
string getValue() { xmlAttrs(this,_,_,result,_,_) } string getValue() { xmlAttrs(this,_,_,result,_,_) }
/** A printable representation of this XML attribute. */ /** Gets a printable representation of this XML attribute. */
override string toString() { result = this.getName() + "=" + this.getValue() } override string toString() { result = this.getName() + "=" + this.getValue() }
} }
/** A namespace used in an XML file */ /** A namespace used in an XML file */
class XMLNamespace extends @xmlnamespace { class XMLNamespace extends @xmlnamespace {
/** The prefix of this namespace. */ /** Gets the prefix of this namespace. */
string getPrefix() { xmlNs(this,result,_,_) } string getPrefix() { xmlNs(this,result,_,_) }
/** The URI of this namespace. */ /** Gets the URI of this namespace. */
string getURI() { xmlNs(this,_,result,_) } string getURI() { xmlNs(this,_,result,_) }
/** Holds if this namespace has no prefix. */ /** Holds if this namespace has no prefix. */
predicate isDefault() { this.getPrefix() = "" } predicate isDefault() { this.getPrefix() = "" }
/** A printable representation of this XML namespace. */ /** Gets a printable representation of this XML namespace. */
string toString() { string toString() {
(this.isDefault() and result = this.getURI()) or (this.isDefault() and result = this.getURI()) or
(not this.isDefault() and result = this.getPrefix() + ":" + this.getURI()) (not this.isDefault() and result = this.getPrefix() + ":" + this.getURI())
@ -248,13 +248,13 @@ class XMLNamespace extends @xmlnamespace {
/** A comment of the form `<!-- ... -->` is an XML comment. */ /** A comment of the form `<!-- ... -->` is an XML comment. */
class XMLComment extends @xmlcomment, XMLLocatable { class XMLComment extends @xmlcomment, XMLLocatable {
/** The text content of this XML comment. */ /** Gets the text content of this XML comment. */
string getText() { xmlComments(this,result,_,_) } string getText() { xmlComments(this,result,_,_) }
/** The parent of this XML comment. */ /** Gets the parent of this XML comment. */
XMLParent getParent() { xmlComments(this,_,result,_) } XMLParent getParent() { xmlComments(this,_,result,_) }
/** A printable representation of this XML comment. */ /** Gets a printable representation of this XML comment. */
override string toString() { result = this.getText() } override string toString() { result = this.getText() }
} }
@ -263,15 +263,15 @@ class XMLComment extends @xmlcomment, XMLLocatable {
* closing tags of an XML element, excluding other elements. * closing tags of an XML element, excluding other elements.
*/ */
class XMLCharacters extends @xmlcharacters, XMLLocatable { class XMLCharacters extends @xmlcharacters, XMLLocatable {
/** The content of this character sequence. */ /** Gets the content of this character sequence. */
string getCharacters() { xmlChars(this,result,_,_,_,_) } string getCharacters() { xmlChars(this,result,_,_,_,_) }
/** The parent of this character sequence. */ /** Gets the parent of this character sequence. */
XMLParent getParent() { xmlChars(this,_,result,_,_,_) } XMLParent getParent() { xmlChars(this,_,result,_,_,_) }
/** Holds if this character sequence is CDATA. */ /** Holds if this character sequence is CDATA. */
predicate isCDATA() { xmlChars(this,_,_,_,1,_) } predicate isCDATA() { xmlChars(this,_,_,_,1,_) }
/** A printable representation of this XML character sequence. */ /** Gets a printable representation of this XML character sequence. */
override string toString() { result = this.getCharacters() } override string toString() { result = this.getCharacters() }
} }