?? wbxmldecoder.java~11~
字號(hào):
writeChildElement(xmlDocument.getDocumentElement());
} catch (Exception exp) {
//exp.printStackTrace();
}
}
private void writeChildElement(Element parent) throws IOException {
byte maskedTokenValue = wbxmlStream.readByte();
while (maskedTokenValue != 01) { // END (of parent element)
byte actualTokenValue = getTokenValue(maskedTokenValue);
if (isInlineStrToken(maskedTokenValue)) // element has text content
writeContentAsInlineStr(parent);
else {
if (isEntityToken(actualTokenValue)) // element has entity
writeEntityContent(parent);
else if (maskedTokenValue == GlobalTokens.OPAQUE)
// element contains opaque data
writeOpaqueContent(parent);
else if (isStringTableReferenceToken(maskedTokenValue)) {
byte indexInStringTable = wbxmlStream.readByte();
writeContentFromStrTable(parent, indexInStringTable);
} else if (actualTokenValue == GlobalTokens.SWITCH_PAGE) {
byte codepageNo = wbxmlStream.readByte();
TokenRepository.setCurrentCodepage(codepageNo);
// TODO specify namespace with xmlns attribute
} else {
String elementName =
tokenRepository.getTagName(actualTokenValue);
Element childElement =
xmlDocument.createElement(elementName);
//childElement.setPrefix(tokenRepository.getCurrentNamespace());
parent.appendChild(childElement);
if (hasAttributes(maskedTokenValue))
setAttributes(childElement);
if (hasContent(maskedTokenValue)) {
writeChildElement(childElement);
maskedTokenValue = wbxmlStream.readByte();
continue;
}
}
}
maskedTokenValue = wbxmlStream.readByte();
}
}
private void writeContentFromStrTable(
Element parent,
int indexInStringTable) {
char c = 0x0;
int endIndex =
stringTable.toString().indexOf(
new String(new char[] { c }),
indexInStringTable);
String content = stringTable.substring(indexInStringTable, endIndex);
Text txtContent = xmlDocument.createTextNode(content);
parent.appendChild(txtContent);
}
private boolean hasAttributes(byte tokenValue) {
return ((tokenValue & attributeBitMask) == attributeBitMask);
}
private boolean hasContent(byte tokenValue) {
return (tokenValue & parentBitMask) == parentBitMask;
}
private void setAttributes(Element element) throws IOException {
byte attrTokenValue = wbxmlStream.readByte();
String currentAttrName = "";
while (attrTokenValue != 01) { // END (of attribue list)
if (isInlineStrToken(attrTokenValue))
writeAttrValueAsInlineStr(element, currentAttrName);
else {
if (isEntityToken(attrTokenValue))
writeEntityAsAttribute(element, currentAttrName);
else if (isStringTableReferenceToken(attrTokenValue)) {
byte indexInStringTable = wbxmlStream.readByte();
writeAttributeFromStrTable(
element,
currentAttrName,
indexInStringTable);
} else {
if (isAttrNameToken(attrTokenValue))
currentAttrName =
writeAttribute(element, attrTokenValue);
else {
if (isAttrValueToken(attrTokenValue))
writeAttrValue(
element,
currentAttrName,
attrTokenValue);
}
}
}
attrTokenValue = wbxmlStream.readByte();
}
}
private String writeAttribute(Element element, byte attrTokenValue) {
String[] attributeNameAndPrefix =
tokenRepository.getAttributeNameAndPrefix(attrTokenValue);
String attributeValue = "";
String attributeName = attributeNameAndPrefix[0].toString();
boolean hasPrefix = attributeNameAndPrefix[1] != null;
if (hasPrefix)
attributeValue = attributeNameAndPrefix[1].trim();
Attr attrNode = xmlDocument.createAttribute(attributeName);
attrNode.setValue(attributeValue);
element.setAttributeNode(attrNode);
return attributeName;
}
private void writeAttrValue(
Element element,
String attrName,
byte attrTokenValue)
throws IOException {
String partialAttrValue = element.getAttribute(attrName);
String attrValue =
partialAttrValue
+ tokenRepository.getAttributeValue(attrTokenValue);
element.setAttribute(attrName, attrValue);
}
private void writeAttributeFromStrTable(
Element element,
String attrName,
byte indexInStringTable) {
String partialAttrValue = element.getAttribute(attrName);
char c = 0x0;
int endIndex =
stringTable.toString().indexOf(
new String(new char[] { c }),
indexInStringTable);
String attrValue =
partialAttrValue
+ stringTable.substring(indexInStringTable, endIndex);
element.setAttribute(attrName, attrValue);
}
private void writeAttrValueAsInlineStr(Element element, String attrName)
throws IOException {
byte aChar = wbxmlStream.readByte();
byte[] content = new byte[1024];
int count = 0;
while (aChar != 0x0) {
content[count++] = aChar;
aChar = wbxmlStream.readByte();
}
String previous_value = element.getAttribute(attrName);
StringBuffer attrValue =
new StringBuffer(
previous_value.equals("null") ? "" : previous_value);
attrValue =
attrValue.append(new String(content, 0, count, this.encoding));
element.setAttribute(attrName, attrValue.toString());
}
private void writeEntityAsAttribute(Element element, String attrName)
throws IOException {
String previous_value = element.getAttribute(attrName);
StringBuffer attrValue =
new StringBuffer(
previous_value.equals("null") ? "" : previous_value);
byte aChar = wbxmlStream.readByte();
while ((aChar & (byte) 0x80) == 0x80) {
// is aChar's continuation flag(MSB) is on)
aChar = (byte) (aChar & 0x7f); //extract remaining 7 bits;
String str1 = Integer.toString(aChar, 2);
attrValue.append(str1);
aChar = wbxmlStream.readByte();
}
String str2 = Integer.toString(aChar, 2);
// last byte in multiple byte format
while (str2.length() < 7)
str2 = "0" + str2;
attrValue.append(str2);
int multipleByteValue = Integer.parseInt(attrValue.toString(), 2);
element.setAttribute(attrName, "&#" + multipleByteValue + ";");
}
private void writeContentAsInlineStr(Element element) throws IOException {
byte aChar = wbxmlStream.readByte();
byte[] content = new byte[1024];
int count = 0;
while (aChar != 0x0) {
content[count++] = aChar;
aChar = wbxmlStream.readByte();
}
String attrValue = new String(content, 0, count, this.encoding);
Text txtContent = xmlDocument.createTextNode(attrValue);
element.appendChild(txtContent);
}
private boolean isEntityToken(byte tokenValue) {
return tokenValue == GlobalTokens.ENTITY;
// todo for other global tokens
}
private boolean isStringTableReferenceToken(byte tokenValue) {
return tokenValue == GlobalTokens.STR_T;
}
private void writeEntityContent(Element element) throws IOException {
StringBuffer attrValue = new StringBuffer();
byte aChar = wbxmlStream.readByte();
while ((aChar & (byte) 0x80) == 0x80) {
// is aChar's continuation flag(MSB) is on)
aChar = (byte) (aChar & 0x7f); //extract remaining 7 bits;
String str1 = Integer.toString(aChar, 2);
attrValue.append(str1);
aChar = wbxmlStream.readByte();
}
String str2 = Integer.toString(aChar, 2);
// last byte in multiple byte format
while (str2.length() < 7)
str2 = "0" + str2;
attrValue.append(str2);
int multipleByteValue = Integer.parseInt(attrValue.toString(), 2);
Text txtContent =
xmlDocument.createTextNode(Integer.toString(multipleByteValue));
element.appendChild(txtContent);
}
private void writeOpaqueContent(Element element) throws IOException {
// StringBuffer opaqueData = new StringBuffer();
byte lengthOfOpaqueData = wbxmlStream.readByte();
// TODO for multi-byte length
byte[] opaqueDataBuf = new byte[lengthOfOpaqueData];
for (int i = 0; i < lengthOfOpaqueData; i++) {
opaqueDataBuf[i] = wbxmlStream.readByte();
}
byte b = wbxmlStream.readByte();
while (b != 1) {
b = wbxmlStream.readByte();
}
String opaqueDataStr = new String(opaqueDataBuf, this.encoding);
Text txtContent = xmlDocument.createTextNode("");
//System.out.println("Opaque____" + opaqueDataStr);
element.appendChild(txtContent);
}
private boolean isInlineStrToken(byte tokenValue) {
return tokenValue == GlobalTokens.STR_ISTR_I;
}
private boolean isAttrNameToken(byte tokenValue) {
return (tokenValue >= 0); // tokenValue is positive implies MSB is 0
}
private boolean isAttrValueToken(byte tokenValue) {
return (tokenValue < 0);
// tokenValue is negative that implies MSB is 1
}
private byte getTokenValue(byte maskedTokenValue) {
byte unmaskedTokenValue = (byte) (maskedTokenValue & ((byte) 0x3f));
// 3f =~ 0011 1111
return unmaskedTokenValue;
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -