void AttributesToXml(XmbFile xmb, XmlDocument doc, XmlElement e) { if (Attributes.Count > 0) { foreach (var kv in Attributes) { string k = xmb.ToString(kv.Key); string v = xmb.ToString(kv.Value); var attr = doc.CreateAttribute(k); attr.Value = v; // #HACK avoids exceptions like: // "The prefix '' cannot be redefined from '' to 'http://www.w3.org/2000/09/xmldsig#' within the same start element tag." // for XML files that weren't meant for the game but were transformed to XMB anyway if (string.CompareOrdinal(k, "xmlns") == 0) { var comment = doc.CreateComment(attr.OuterXml); e.AppendChild(comment); continue; } e.Attributes.Append(attr); } } }
void InnerTextToXml(XmbFile xmb, XmlDocument doc, XmlElement e) { if (!InnerTextVariant.IsEmpty) { var text = doc.CreateTextNode(xmb.ToString(InnerTextVariant)); e.AppendChild(text); } }
void ChildrenToXml(XmbFile xmb, XmlDocument doc, XmlElement e) { if (ChildrenIndices.Count > 0) { foreach (int x in ChildrenIndices) { var element = xmb.mElements[x]; element.ToXml(xmb, doc, e); } } }
public XmlElement ToXml(XmbFile xmb, XmlDocument doc, XmlElement root) { var e = doc.CreateElement(xmb.ToString(NameVariant)); if (root != null) { root.AppendChild(e); } AttributesToXml(xmb, doc, e); ChildrenToXml(xmb, doc, e); InnerTextToXml(xmb, doc, e); return(e); }
public void ReadAttributes(XmbFile xmb, IO.EndianReader s) { if (mAttributesOffset.IsInvalidHandle) { return; } s.Seek((long)mAttributesOffset); for (int x = 0; x < Attributes.Capacity; x++) { XmbVariant k; XmbVariantSerialization.Read(s, out k); XmbVariant v; XmbVariantSerialization.Read(s, out v); var kv = new KeyValuePair <XmbVariant, XmbVariant>(k, v); Attributes.Add(kv); if (k.HasUnicodeData || v.HasUnicodeData) { xmb.mHasUnicodeStrings = true; } } }
public void Read(XmbFile xmb, XmbFileContext xmbContext, IO.EndianReader s) { s.Read(out RootElementIndex); XmbVariantSerialization.Read(s, out NameVariant); XmbVariantSerialization.Read(s, out InnerTextVariant); if (xmbContext.PointerSize == Shell.ProcessorSize.x64) { s.Pad32(); } #region Attributes header int count; s.Read(out count); if (xmbContext.PointerSize == Shell.ProcessorSize.x64) { s.Pad32(); } s.ReadVirtualAddress(out mAttributesOffset); Attributes = new List <KeyValuePair <XmbVariant, XmbVariant> >(count); #endregion #region Children header s.Read(out count); if (xmbContext.PointerSize == Shell.ProcessorSize.x64) { s.Pad32(); } s.ReadVirtualAddress(out mChildrenOffset); ChildrenIndices = new List <int>(count); #endregion if (NameVariant.HasUnicodeData || InnerTextVariant.HasUnicodeData) { xmb.mHasUnicodeStrings = true; } }